今天在測試springboot整合redis的時候遇到下面這個坑,百度來百度去發現提示都是ajax的問題,真的是醉了,錯誤提示如下所示,不信大家可以直接複制百度一下答案是什麼(流淚中。。。。),錯誤如下:
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unrecognized token 'b4811c63': was expecting ('true', 'false' or 'null')
1.錯誤原因排查
然後就進行debug調試,發現代碼一直到redisTemplate.opsForZSet().reverseRangeWithScores()這一行都沒問題,然後進入redis源代碼裡面檢查,發現是在發送redis服務的時候出現問題,是以可以斷定應該是配置的問題,然後仔細檢查配置,發現也沒有錯誤,redis序列化的配置如下所示:
2.細節分析
這一條線索斷掉之後,隻能通過錯誤資訊來分析了,錯誤資訊中有一條特别奇怪,就是token 'b4811c63',然後我仔細從redis中對比,發現是之前存儲的redis的key值,判斷可能是redis中key存在亂碼,是以就将redis的key全部清空,自己添加資料進去,發現自己添加的資料是可以的。從這一現象可以得出,應該實作老系統序列化的規則和現在springboot的序列化規則不一樣導緻的,檢視老系統的redis配置資訊,如下所示:
3.問題解決
然後和我們剛才序列化的方式對比一下,發現真的是序列化方式不一樣,舊的是通過StringRedisSerializer進行序列化的,springboot是通過Jackson2JsonRedisSerializer進行序列化的。是以為了相容老系統的序列化方式,這邊我将springboot也改成StringRedisSerializer的序列化方式,代碼如下所示:
改完之後,發現這個問題就沒有了,redis中就可以照常插入、查詢資料了。
總結:
這個問題是很典型的架構優化問題,老系統和新系統代碼相容性問題。從這個坑可以得出這樣的結論:百度得到的答案很大一部分都是片面的,我們還是得根據實際情況來分析。其次就是要仔細看報錯資訊,不要放過一點細節,因為可能你的答案就在這一點細節中。