【springboot】redisTemplate Redis key出现\xac\xed\x00\x05t\x00

现象

springboot项目使用redisTemplate整合redis,测试写入字符串类型的key、value,通过redis可视化工具观察redis存储数据,发现key不符合测试预期,出现\xac\xed\x00\x05t\x00等

源码

@Service@Slf4j
public class RedisService {

    @Resource
    private RedisTemplate redisTemplate;

    public void put(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }
}

解决

手上恰好有能够正常使用的其他项目,对比启动日志发现以下问题
正常

2021-12-03 14:32:20.940 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'redisService' 
2021-12-03 14:32:20.948 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'stringRedisTemplate' 

异常

2021-12-03 14:29:05.776 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'redisService' 
2021-12-03 14:29:05.779 [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Creating shared instance of singleton bean 'redisTemplate' 

实例化的redisTemplate对象不同,StringRedisTemplate使用RedisSerializer.string()作为序列化工具,能够正确处理字符串。而RedisTemplate使用默认JdkSerializationRedisSerializer,序列化字符串时出现异常。

查看代码,发现redisTemplate的注入方式不同,是导致问题的根本原因

对象 注入方式
stringRedisTemplate @Autowire
redisTemplate @Resource

结论

将注入方式修改为@Autowire,问题解决
@Resource,通过name注入,匹配到redisTemplate类
@Autowire,通过type注入,匹配到StringRedisTemplate extends RedisTemplate

欢迎大家留言交流讨论,如果对你有帮助,请点个赞吧

你可能感兴趣的:(springboot,java,redis,spring,boot)