1.问题起因
由于业务相关需要在代码中添加配置相关操作,由于该接口各个模块都需要调用该服务,因此在接口中用redis做了缓存(首次查询在redis中没有查库,然后保存到redis中,再次查询走redis查询后返回),在代码中流转没有问题,但是为了保证准确性,使用redis客户端连接到库中进行搜索发现找不到该key:查询如下图
2.排查问题
a).首先检查redis服务器异常,redis库ip或者db不对(检查发现都没有问题)
b).那么代码中使用的redisTemplate中的set/get方法是否遵循了某种规范
set方法对value进行转换 String -> byte[]
get方法在获取的时候把key进行转换String -> byte[]
那么在获取key的时候把key转换成byte[]进行获取是否就有值了
按照redis的规则对key进行转换发现方法是protected的,无法访问
那么转换思路,我再去调用一次set方法,观察当前db中的数量是否增加,然后排查增加的是那一个数据
于是修改开发环境redis配置把db切换到一个数据非常少的库中,然后重新掉接口,保存数据,在redis客户端发现多了一个乱码的集合,如图
至此,问题基本可以确定就是由于序列化的问题导致的,在spring的启动类上增加如下配置
再次进行测试(结果正常)
至此,问题解决!!!!
备注:
在没有加序列化的时候增加的key,在增加序列化之后是识别不到的,因此在增加该配置的时候需要在服务中搜索一下,其他人是否使用了redisTemplate,如果使用则要评估下是否会影响他人