Bootstrap

【日常踩坑】SpringBoot使用RedisTemplate保存Map时key、value都出现乱码

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);

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;