redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題及解決
redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&的問題
在使用redis存放鍵值對時,發(fā)現(xiàn)存放的key和value多了\xac\xed\x00\x05t\x00&的前綴,筆者存放的是字符串,結果如下圖所示,出現(xiàn)非預期的前綴。

出現(xiàn)該問題的原因是
redis template向redis存放使用java對象序列化的值,序列化方式和string的一般方式不同。
明明指定的另一個引文字符串作為key,但是實際存儲后卻多出來一串奇異字符串,這讓筆者好奇心頓時升起來了,決定debug調試一下

從set()方法進入一路對execute()的重載方法向下跟蹤,最終來到了一個T result = action.doInRedis(connToExpose);代碼處

step into 進入doInRedis方法,

可以看到在一開始傳入的匿名對象就是這個ValueDeserializingRedisCallback抽象類的一個匿名子類,并實現(xiàn)了set方法的最后一步,將數據存入redis。
來看看我的字符串key是怎么轉化成byte數組的。
對rawKey方法向下追蹤…
1.獲取Key的序列化器,然后對我們的key進行序列化


進入serialize(key)方法,執(zhí)行了JdkSerializationRedisSerializer類中的serialize方法。
繼續(xù)向下跟蹤…



最終?。。?!
原來是使用了JDK自帶的ObjectOutPutStream將我們的String對象序列化成了byte[],

來看看我們把byte數組轉回字符串key發(fā)現(xiàn)在我原本的key之前確實拼接了亂碼的字符串。

RedisTemplate對Key的序列化了解了后,我們在看看對Value的序列化是怎么一回事?


最終結果是同樣的使用JDK自帶的對象輸出流對其進行序列化

在Key和Value都序列化后,將數據存入Redis。
最終總結可以發(fā)現(xiàn)一切原因都是這個默認的JdkSerializationRedisSerializerJDKRedis序列化器的序列化方式不能讓人接受。
知道了問題所在,這個問題就已經解決了一半了。
我們能不能不使用這個默認的JDKRedis序列化器,自己實現(xiàn)一個或者換一個呢?
很幸運,Spring已經為我們提供了許多類型的序列化器了

一般我們常用的序列化器是Jackson2JsonRedisSerializer和StringRedisSerializer這兩種。
看名字就知道Jackson2JsonRedisSerializer是將對象序列化成JSON形式的序列化器了。
Jackson2JsonRedisSerializer:常用來直接序列化Value對象為JSON字符串。內部使用ObjectMapperStringRedisSerializer:常用來序列化Key,也可以用來序列化Value。
于是乎我們對RedisTemplate進行配置
/**
* 如果key和value都使用的StringRedisSerializer序列化器,則推薦使用StringRedisTemplate
*
* 配置Redis的Key和Value的序列化器
* @param redisTemplate 從容器中獲取RedisTemplate
* @return 修改后的RedisTemple
*/
@Bean
public RedisTemplate<Object, Object> redisStringTemplate(RedisTemplate<Object, Object> redisTemplate) {
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
// 如果手動將Value轉換成了JSON,就不要再用JSON序列化器了。
// redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
redisTemplate.setValueSerializer(stringRedisSerializer);
return redisTemplate;
}查驗結果
key和value的序列化和反序列化都正常了。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Redis分布式鎖python-redis-lock使用方法
這篇文章主要介紹了Redis分布式鎖python-redis-lock使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11
Redis高級玩法之利用SortedSet實現(xiàn)多維度排序的方法
Redis的SortedSet是可以根據score進行排序的,以手機應用商店的熱門榜單排序為例,根據下載量倒序排列。接下來通過本文給大家分享Redis高級玩法之利用SortedSet實現(xiàn)多維度排序的方法,一起看看吧2019-07-07

