SpringBoot使用RedisTemplate操作redis出现\xAC\xED\x00\x05t\x00\x08乱码问题

SpringBoot在redis的操作中出现诸如\xAC\xED\x00\x05t\x00\x08这种乱码问题,原因都是RedisTemplate的key和value序列化方式都默认使用了jdk的序列化方式,想要解决乱码问题我们只需要将key和value的序列化方式分别修改为字符串和json的形式即可。

但是在SpringBoot中redis配置改造之在@Cacheable注解上实现自定义缓存过期时间中,我对RedisCacheManager进行了改造,编写了一个支持使用key自定义缓存过期时间的CustomTtlRedisCacheManager类。在这个类中我已经修改了序列化方式,但是在实际使用中还是出现了部分key是乱码的问题,原因是啥呢?经过排查,我发现,只要是直接使用RedisTemplate操作的key都会有乱码,经过进一步测试,我得出了问题的原因:

因为CustomTtlRedisCacheManager中对序列化的修改只会对使用@Cacheable实现的redis缓存有效果,对于RedisTemplate,默认使用的还是jdk的序列化方式,所以解决办法就出来了,在RedisConfig中我们对RedisTemplate的序列化方式也进行一下改造。在RedisConfig中添加如下代码即可。

/**
* redisTemplate 序列化默认使用的jdkSerializeable
* 所以在这里使用自定义的序列化类
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory);

    // 设置key的序列化规则和value的序列化规则
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}