RedisTemplate:我不背锅,是你用错了
今天分享一个RedisTemplate的问题,感兴趣的可以继续看下去了,不感兴趣的继续撩妹去吧!
如下图:一位朋友给了我一个报错的图片,为啥为啥取不到值?
我也有点懵,第一反应就是RedisTemplate和StringRedisTemplate会不会用的两个不同的Connection,导致相同的Key一个能查到,一个不能查到。
经过反复确认,Connection没问题,是同一个,还是那句话:每个奇怪问题的背后一定有故事。
只能调试源码了呗,还能怎么办。最后在redis.clients.jedis.BinaryJedis#hget中发现了问题,就是Redis压根就没有返回数据。
现在的问题就剩下为什么StringRedisTemplate的查询可以返回数据,RedisTemplate的查询却不能返回数据?
我们来屡一下StringRedisTemplate和RedisTemplate的关系,StringRedisTemplate继承了RedisTemplate,是专门用于字符串操作。
RedisTemplate一般用于比较复杂的对象操作,区别就在于序列化的不同。
于是我用redis客户端查看了存储的数据格式,发现这个Hash的格式是字符串。
这也就是为什么用StringRedisTemplate可以获取到,估计存储的时候就是用的StringRedisTemplate。
RedisTemplate默认的序列化方式是JDK序列化,格式不对。
于是查看了RedisTemplate的构造方式,发现就是序列化方式不一致。
于是将jdkSerializationRedisSerializer改成了stringSerializer。重新跑了一遍测试还是不行。于是我看了下RedisTemplate对象的信息,如下:
valueSerializer是改过来了,但是hash有专门的序列化,还是JDK。
那就全部改成一样的吧,如下:
然后就能获取到了,个人感觉这个还是一个使用的问题,可能大家都以为这2个RedisTemplate是一样的,没什么差别,所以才导致了本文出现的问题。
如果你够细心,其实看下源码就知道这2个类的区别了。
StringRedisTemplate构建的时候默认设置了所有的序列化方式为String,也就是说StringRedisTemplate的数据格式都是String。
RedisTemplate没有设置的话就都是JDK。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-03-11 JAVA开发者大会-Spring Cloud网关分享
2019-03-11 Spring Cloud Gateway重试机制