今天分享一個RedisTemplate的問題,感興趣的能夠繼續看下去了,不感興趣的繼續撩妹去吧!git
以下圖:一位朋友給了我一個報錯的圖片,爲啥爲啥取不到值?github
我也有點懵,第一反應就是RedisTemplate和StringRedisTemplate會不會用的兩個不一樣的Connection,致使相同的Key一個能查到,一個不能查到。redis
通過反覆確認,Connection沒問題,是同一個,仍是那句話:每一個奇怪問題的背後必定有故事。微信
只能調試源碼了唄,還能怎麼辦。最後在redis.clients.jedis.BinaryJedis#hget中發現了問題,就是Redis壓根就沒有返回數據。測試
如今的問題就剩下爲何StringRedisTemplate的查詢能夠返回數據,RedisTemplate的查詢卻不能返回數據?3d
咱們來屢一下StringRedisTemplate和RedisTemplate的關係,StringRedisTemplate繼承了RedisTemplate,是專門用於字符串操做。調試
RedisTemplate通常用於比較複雜的對象操做,區別就在於序列化的不一樣。cdn
因而我用redis客戶端查看了存儲的數據格式,發現這個Hash的格式是字符串。對象
這也就是爲何用StringRedisTemplate能夠獲取到,估計存儲的時候就是用的StringRedisTemplate。blog
RedisTemplate默認的序列化方式是JDK序列化,格式不對。
因而查看了RedisTemplate的構造方式,發現就是序列化方式不一致。
因而將jdkSerializationRedisSerializer改爲了stringSerializer。從新跑了一遍測試仍是不行。因而我看了下RedisTemplate對象的信息,以下:
valueSerializer是改過來了,可是hash有專門的序列化,仍是JDK。
那就所有改爲同樣的吧,以下:
而後就能獲取到了,我的感受這個仍是一個使用的問題,可能你們都覺得這2個RedisTemplate是同樣的,沒什麼差異,因此才致使了本文出現的問題。
若是你夠細心,其實看下源碼就知道這2個類的區別了。
StringRedisTemplate構建的時候默認設置了全部的序列化方式爲String,也就是說StringRedisTemplate的數據格式都是String。
RedisTemplate沒有設置的話就都是JDK。
感興趣的能夠關注下個人微信公衆號 猿天地,更多技術文章第一時間閱讀。個人GitHub也有一些開源的代碼 github.com/yinjihuan