在做 redis 的迁移工作的时候,已经将 redis 缓存数据导入进去,string 类型的数据结构显示正常,而 hash 类型的数据结构则查询出来的 value 值是 null:
于是去排查代码:
这里明显 hashKeys
这个 key 值得怀疑,通过排查得知,hashOperations.keys(key) 是一个查询 redis key 值的方法,例如 hashOperations.keys("app") 就能查询出来 key 值中以 app_ 开头的所有 key,所以这肯定不对。
需求:如果 value 值的数据结构是 hash 类型的话,通过 redis 的 key 值查询出所有的 hashkey。
所以应该调用的方法是:hashOperations.hkeys(key)
于是我在想为什么之前的同事写出来这种代码程序还能正常运行呢?于是我去跟踪程序:
原因是在 nacos.properties 文件中有关于 redis 的配置项:
在本地发开环境中用的都是 DEV_GROUP,但由于我本次要进行 redis 的数据迁移,需要把服务器 A 的数据迁移到服务器 B,所以需要切换配置 YAO_GROUP:
由于切换了 redis 的配置指向,代码调用 redis 的方式也发生了改变,在项目中,RedisCache 暴露出来的接口是统一的,但实际上它被两个类实现,而这两个类又分别调用的是 RedisTemplate 和 Jedis 的接口,在 RedisTemplate 中获取所有的 hashkey 的写法是 hashOperations.keys(key) 这样没错,这也就解释了之前的代码为什么在生产中可以正常使用,因为之前没有走 redis.grout=YAO_GROUP 的需求。