RedisTemplate value序列化导致的问题
大家好,我是烤鴨:
? ? ? 今天分享一個(gè)redisTemplate 使用時(shí),value 序列化的問題。
1. ?問題描述
? ?其實(shí)我最開始遇到的問題是:
? ?stringRedisTemplate.opsForSet().isMember(key,value)一直返回false問題,下邊博客給出了答案
? ?https://blog.csdn.net/weixin_39523456/article/details/108236181
? ?改完之后又出現(xiàn)了新問題,沒辦法就跟著看了下源碼。
? ?發(fā)現(xiàn)是value在不同的序列化方式下的問題?
? ?
2. 情景復(fù)現(xiàn)及源碼
? ?用的value的序列化方式是:GenericJackson2JsonRedisSerializer
? ?這個(gè)是 測(cè)試的代碼,返回的結(jié)果 Long類型的true , String 類型的 false
? ?但是我們通過控制臺(tái)看一下呢,感覺也沒啥區(qū)別啊,返回的都是 1
? ?這時(shí)候我想看一下redis服務(wù)端接收到命令到底是啥,為啥返回結(jié)果不同。由于客戶端這邊寫入的字節(jié)數(shù)據(jù)(也就是下邊的write方法),沒辦法看,只能從服務(wù)端想辦法。
? ?服務(wù)端通過monitor 命令開啟執(zhí)行過的命令,由于是監(jiān)控當(dāng)前節(jié)點(diǎn)的。如果是集群模式,必須每個(gè)節(jié)點(diǎn)單獨(dú)開啟(數(shù)據(jù)在哪臺(tái),就開哪臺(tái))。
?./redis-cli -h 127.0.0.1 -p 6001monitor?? ?這下捕捉到了服務(wù)端接收的指令。
? ?這下明白了,如果是String 類型的,使用 GenericJackson2JsonRedisSerializer 序列化方式,會(huì)在外側(cè)被加上一個(gè)轉(zhuǎn)義雙引號(hào) ""
? ?通過控制臺(tái)查看的結(jié)果是這樣的。
? ?
3. 關(guān)于最開始的問題和解決方案
? ?上面的博客解決方案不適用于我,項(xiàng)目里redis已經(jīng)在別的地方使用過,改了一下序列化方式,發(fā)現(xiàn)會(huì)影響之前的方法,因?yàn)樵械臄?shù)據(jù)是通過 GenericJackson2JsonRedisSerializer ?的序列化方式寫入的,當(dāng)使用 StringRedisSerializer 會(huì)出現(xiàn)下面的問題,又多了雙引號(hào)...其實(shí)不是多了雙引號(hào),是本來就是這種結(jié)構(gòu),只是用 GenericJackson2JsonRedisSerializer ?反序列化的時(shí)候會(huì)只保留一個(gè) "",變成String類型。
? ?這個(gè)跟哪種序列化的方式?jīng)]關(guān)系,是哪種存的,取的時(shí)候就用哪種。不要隨意修改序列化方式!!!
4. ?最終的解決方案
? ?既然不能改序列化方式,又對(duì)存入的數(shù)據(jù)結(jié)構(gòu)沒什么把握,建議做兩手準(zhǔn)備...
?
總結(jié)
以上是生活随笔為你收集整理的RedisTemplate value序列化导致的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。