默认情况下SpringBoot的stringRedisTempalte只能存string,redisTemplate如果存入bytes也会报错,是因为找不到相应的ValueSerializer,或者用默认的StringRedisSerializer来序列化,导致bytes无法转成String而报错。
我们可以在Redis的配置文件下,指定相应的ValueSerializer。
RedisConfiguration.java的配置如下:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfiguration {
@Bean(name="redisTemplate")
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate();
GenericToStringSerializer<String> keySerializer = new GenericToStringSerializer<>(String.class);
template.setKeySerializer(keySerializer);
template.setHashKeySerializer(keySerializer);
StringRedisSerializer valueSerializer = new StringRedisSerializer();
template.setValueSerializer(valueSerializer);
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(factory);
return template;
}
@Bean(name = "bytesRedisTemplate")
public RedisTemplate<String, byte[]> bytesRedisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, byte[]> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
// 设置key和value的序列化规则
redisTemplate.setValueSerializer(RedisSerializer.byteArray());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
使用如下:
@Autowired RedisTemplate<String, byte[]> redisTemplate; byte[] bytes = file.getBytes(); // 存入bytes redisTemplate.opsForValue().set(redisKey, bytes, 365, TimeUnit.DAYS); // 读取 redisTemplate.opsForValue().get(redisKey);
文章评论