SpringBoot使用RedisTemplate保存Map时key、value都出现乱码,类似于(\x00\x00\x00)
原因
redis key存在二进制字符
是因为redisTemplate 序列化使用的jdkSerializeable, 存储二进制字节码,所以需要自定义序列化类来对redis key进行序列化
redis value(Map对象存在乱码)
是因为是因为使用redisTemplate 保存时,指定了过期时间,但是没有指定过期时间的类型,即缺少(TimeUnit.SECONDS)
redisTemplate.opsForValue().set(MonitorConstants.DOMAIN_WEBSITE_NUM_STATISTIC, parseList(result),10*60, TimeUnit.SECONDS);
解决方法
redis key存在二进制字符
创建配置类,自定义redisTemplate序列化类
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
/**
* redisTemplate 序列化使用的jdkSerializeable, 存储二进制字节码, 所以自定义序列化类
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
redis value(Map对象存在乱码)
指定过期时间的时间类型即可
redisTemplate.opsForValue().set(MonitorConstants.DOMAIN_WEBSITE_NUM_STATISTIC, parseList(result),10*60);
改为
redisTemplate.opsForValue().set(MonitorConstants.DOMAIN_WEBSITE_NUM_STATISTIC, parseList(result),10*60, TimeUnit.SECONDS);