今天分享一个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。

最新文章

  1. 数据结构之C语言实现哈夫曼树
  2. js乱码解决方法
  3. 对于undefined和null,还有处理这一类的数组
  4. iOS8后core location框架启动定位服务的步骤
  5. 症状解决,原因不详的用非默认管理权限账户登录COM注册成功但找不到类型问题
  6. oracle 触发器学习
  7. Oracle表空间数据文件移动的方法
  8. HTML网页内容转换成字符串(删除从指定字符串到指定字符串)
  9. 结构类模式(二):桥接(Bridge)
  10. 【网络】 NAT
  11. IOS 定位 单例
  12. android入门——Service
  13. Paxos算法简单介绍
  14. hdu_2838_Cow Sorting(树状数组求逆序对)
  15. ajax之XML简介
  16. 【Linux】 Linux权限管理与特殊权限
  17. 03 SeekBar 音频播放拖拽进度条
  18. 【Java入门提高篇】Day16 Java异常处理(上)
  19. CentOS 7下Samba服务部署
  20. linux 串口驱动(二)初始化 【转】

热门文章

  1. 解决2013Lost connection to MySQL server during query错误方法
  2. Python 网站后台扫描
  3. [LC] 13. Roman to Integer
  4. 71)PHP,使用cookie的语法问题
  5. nginx负载均衡如何实现
  6. spring-boot jpa mysql emoji utfmb4 异常处理
  7. 《时间线》:WWT 数字宇宙,虚拟星空
  8. 无人工地,原来是靠AI这样运行的
  9. Mybatis-Generator相关配置demo
  10. unittest(20)- 自动更新表格中数据(5)