RedisTemplate:我不背锅,是你用错了

今天分享一个RedisTemplate的问题,感兴趣的能够继续看下去了,不感兴趣的继续撩妹去吧!html

以下图:一位朋友给了我一个报错的图片,为啥为啥取不到值?redis

我也有点懵,第一反应就是RedisTemplate和StringRedisTemplate会不会用的两个不一样的Connection,致使相同的Key一个能查到,一个不能查到。测试

通过反复确认,Connection没问题,是同一个,仍是那句话:每一个奇怪问题的背后必定有故事。3d

只能调试源码了呗,还能怎么办。最后在redis.clients.jedis.BinaryJedis#hget中发现了问题,就是Redis压根就没有返回数据。调试

如今的问题就剩下为何StringRedisTemplate的查询能够返回数据,RedisTemplate的查询却不能返回数据?htm

咱们来屡一下StringRedisTemplate和RedisTemplate的关系,StringRedisTemplate继承了RedisTemplate,是专门用于字符串操做。对象

RedisTemplate通常用于比较复杂的对象操做,区别就在于序列化的不一样。blog

因而我用redis客户端查看了存储的数据格式,发现这个Hash的格式是字符串。继承

这也就是为何用StringRedisTemplate能够获取到,估计存储的时候就是用的StringRedisTemplate。图片

RedisTemplate默认的序列化方式是JDK序列化,格式不对。

因而查看了RedisTemplate的构造方式,发现就是序列化方式不一致。

因而将jdkSerializationRedisSerializer改为了stringSerializer。从新跑了一遍测试仍是不行。因而我看了下RedisTemplate对象的信息,以下:

valueSerializer是改过来了,可是hash有专门的序列化,仍是JDK。

那就所有改为同样的吧,以下:

而后就能获取到了,我的感受这个仍是一个使用的问题,可能你们都觉得这2个RedisTemplate是同样的,没什么差异,因此才致使了本文出现的问题。

若是你够细心,其实看下源码就知道这2个类的区别了。

StringRedisTemplate构建的时候默认设置了全部的序列化方式为String,也就是说StringRedisTemplate的数据格式都是String。

RedisTemplate没有设置的话就都是JDK。

原文出处:https://www.cnblogs.com/yinjihuan/p/12462001.html

相关文章
相关标签/搜索