關(guān)于Redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&錯(cuò)誤的解決方法
Redis的\xac\xed\x00\x05t\x00&錯(cuò)誤
筆者在使用redis存放鍵值對(duì)時(shí),發(fā)現(xiàn)存放的key和value多了\xac\xed\x00\x05t\x00&的前綴,筆者存放的是字符串,結(jié)果如下圖所示,出現(xiàn)非預(yù)期的前綴。
出現(xiàn)該問(wèn)題的原因是, redis template 向redis存放使用java對(duì)象序列化的值,序列化方式和string的一般方式不同。
明明指定的另一個(gè)引文字符串作為key,但是實(shí)際存儲(chǔ)后卻多出來(lái)一串奇異字符串,這讓筆者好奇心頓時(shí)升起來(lái)了,決定debug調(diào)試一下
從set()方法進(jìn)入一路對(duì)execute()的重載方法向下跟蹤,最終來(lái)到了一個(gè) T result = action.doInRedis(connToExpose); 代碼處
step into 進(jìn)入doInRedis方法,
可以看到在一開(kāi)始傳入的匿名對(duì)象就是這個(gè) ValueDeserializingRedisCallback 抽象類(lèi)的一個(gè)匿名子類(lèi),并實(shí)現(xiàn)了set方法的最后一步,將數(shù)據(jù)存入redis。
來(lái)看看我的字符串key是怎么轉(zhuǎn)化成byte數(shù)組的。對(duì)rawKey方法向下追蹤…
獲取Key的序列化器,然后對(duì)我們的key進(jìn)行序列化
進(jìn)入 serialize(key) 方法,執(zhí)行了 JdkSerializationRedisSerializer 類(lèi)中的serialize方法。
繼續(xù)向下跟蹤…
最終?。。。?,原來(lái)是使用了JDK自帶的 ObjectOutPutStream 將我們的String對(duì)象序列化成了byte[],
來(lái)看看我們把byte數(shù)組轉(zhuǎn)回字符串key發(fā)現(xiàn)在我原本的key之前確實(shí)拼接了亂碼的字符串。
RedisTemplate對(duì)Key的序列化了解了后,我們?cè)诳纯磳?duì)Value的序列化是怎么一回事?
最終結(jié)果是同樣的使用JDK自帶的對(duì)象輸出流對(duì)其進(jìn)行序列化。
在Key和Value都序列化后,將數(shù)據(jù)存入Redis。
最終總結(jié)可以發(fā)現(xiàn)一切原因都是這個(gè)默認(rèn)的 JdkSerializationRedisSerializer JDKRedis序列化器的序列化方式不能讓人接受。
知道了問(wèn)題所在,這個(gè)問(wèn)題就已經(jīng)解決了一半了。
我們能不能不使用這個(gè)默認(rèn)的JDKRedis序列化器,自己實(shí)現(xiàn)一個(gè)或者換一個(gè)呢?
很幸運(yùn),Spring已經(jīng)為我們提供了許多類(lèi)型的序列化器了
一般我們常用的序列化器是 Jackson2JsonRedisSerializer 和 StringRedisSerializer 這兩種。
看名字就知道Jackson2JsonRedisSerializer是將對(duì)象序列化成JSON形式的序列化器了。
- Jackson2JsonRedisSerializer :常用來(lái)直接序列化Value對(duì)象為JSON字符串。內(nèi)部使用ObjectMapper
- StringRedisSerializer :常用來(lái)序列化Key,也可以用來(lái)序列化Value。
于是乎我們對(duì)RedisTemplate進(jìn)行配置:
/** * 如果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); // 如果手動(dòng)將Value轉(zhuǎn)換成了JSON,就不要再用JSON序列化器了。 // redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); redisTemplate.setValueSerializer(stringRedisSerializer); return redisTemplate; }
查驗(yàn)結(jié)果:key和value的序列化和反序列化都正常了。
到此這篇關(guān)于關(guān)于Redis鍵值出現(xiàn)\xac\xed\x00\x05t\x00&錯(cuò)誤的解決方法的文章就介紹到這了,更多相關(guān)Redis鍵值xac報(bào)錯(cuò)解決方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SMBMS超市訂單管理系統(tǒng)的網(wǎng)站源碼
這篇文章主要介紹了SMBMS超市訂單管理系統(tǒng),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05JAVA設(shè)計(jì)模式零基礎(chǔ)解析之單例模式的八種方式
設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類(lèi)編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性2021-10-10Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問(wèn)題解決
這篇文章主要介紹了Redis分布式鎖實(shí)現(xiàn)方式及超時(shí)問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04基于apache poi根據(jù)模板導(dǎo)出excel的實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇基于apache poi根據(jù)模板導(dǎo)出excel的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06IntelliJ?IDEA2022.3?springboot?熱部署含靜態(tài)文件(最新推薦)
這篇文章主要介紹了IntelliJ?IDEA2022.3?springboot?熱部署含靜態(tài)文件,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01Java之如何讀取Excel獲取真實(shí)行數(shù)
這篇文章主要介紹了Java之如何讀取Excel獲取真實(shí)行數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2023-06-06SpringSecurity+jwt+captcha登錄認(rèn)證授權(quán)流程總結(jié)
本文介紹了SpringSecurity、JWT和驗(yàn)證碼在Spring Boot 3.2.0中的應(yīng)用,包括登錄認(rèn)證和授權(quán)流程的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-11-11log4j2 項(xiàng)目日志組件的實(shí)例代碼
下面小編就為大家分享一篇log4j2 項(xiàng)目日志組件的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12