關(guān)于redisson緩存序列化的幾枚大坑說明
redisson緩存序列化幾枚坑
1、返回值為Map<T, K> 的方法增加@Cacheable后,T和K被類型擦出了,為啥?
redisson結(jié)合Spring使用時(shí),會有RedissonSpringCacheManager,將redissonClient自動注入,另外還有codec的概念,即序列化和反序列化,可以查看實(shí)現(xiàn)類,就幾種實(shí)現(xiàn),假設(shè)我們使用org.redisson.codec.JsonJacksonCodec,可以看到,decode中,僅一個Object.class,即范型信息并未帶入,故出現(xiàn)了問題

2、對于匿名內(nèi)部類的濫用導(dǎo)致反序列化失敗
你會想,匿名內(nèi)部類有什么影響?
那么跟著我看下我們時(shí)常會寫的一種Map寫法:
Map<String, Object> map = new HashMap(){{put("mykey", "test");}};
這種方式有什么問題呢,這就涉及到匿名內(nèi)部類聲明方式在實(shí)際編譯時(shí)是如何存在于class文件中的
...
$1 extends HashMap{
...
}
...
也就是新生成了一個匿名類型,而這個類型在反序列化時(shí)是沒辦法找到構(gòu)造函數(shù)的,故而是有問題的。
按上面寫法后,序列化時(shí),存儲的是xxx$1這個匿名類型,所以反序列化也就失敗了。
redis的坑(序列化、scan)
最近做的一個項(xiàng)目用到redis,需要使用redis對數(shù)據(jù)進(jìn)行緩存,用戶的動作也會更新redis中的數(shù)據(jù),為了方便管理,采用了hash的方式。神坑就此開始。
最開始是序列化的坑
使用包裝的ByteArrayRedisTemplate時(shí),對象存入redis之后,rdm可以查看到,但是程序里面取出來是亂碼,使用原生的RedisTemplate就不會出現(xiàn)這個問題,后來發(fā)現(xiàn)是對象包裝的問題,原生的RedisTemplate中支持將value設(shè)置為對象,但是包裝的ByteArrayRedisTemplate只能用byte[],所以我這邊先把對象轉(zhuǎn)為json,然后json轉(zhuǎn)為byte[],再寫入redis,取數(shù)據(jù)的時(shí)候,查redis的結(jié)果是byte[],然后轉(zhuǎn)為json,再轉(zhuǎn)為對象,就沒問題了。
但是?。。〔恢朗裁丛?,這樣做之后rdm中查不到這個key了,可能是redis版本和rdm版本不兼容的問題,這個有待驗(yàn)證。你看到的一切不一定存在,你看不到的也不一定不存在,當(dāng)個碼農(nóng)還要思考這些哲學(xué)問題。。。
還有一個坑
spring整合的redis是不支持scan指令的,而且不只是scan指令,基本上所有摟全量的指令都被禁止,當(dāng)然,像keys之類的指令還是能用,但是在生產(chǎn)環(huán)境下千萬不要使用,因?yàn)楹苋菀鬃枞?,業(yè)務(wù)動不動就停幾秒,很尷尬。而且現(xiàn)在大部分在生產(chǎn)環(huán)境下使用的redis都是用codis包裝的,codis更絕,直接禁止使用那些指令,同志們可以自己動手搜一下,被禁止的指令還是挺多得,我第一次看還以為自己看錯了,尼瑪禁了一大半,摟全量的指令全部被禁。不過這樣做的好處就是數(shù)據(jù)安全,使用scan指令的漏洞撈數(shù)據(jù)的軟件也不在少數(shù)。
最后項(xiàng)目只能放棄使用redis了,因?yàn)槲冶仨毜脫?。。。通過這個事件也懂得了,代碼開發(fā)一定要一邊開發(fā)一邊測試(自己測試),不然有的坑,掉進(jìn)去了都不知道,還在屁顛屁顛的往里刨,最后把自己埋了。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Redis對批量數(shù)據(jù)實(shí)現(xiàn)分布式鎖的實(shí)現(xiàn)代碼
為了防止多人多電腦同時(shí)操作一條數(shù)據(jù),我們自己開發(fā)了一個簡單的基于Redis實(shí)現(xiàn)的分布式鎖,Redis對批量數(shù)據(jù)實(shí)現(xiàn)分布式鎖相關(guān)知識感興趣的朋友一起看看吧2022-03-03
設(shè)置Redis最大占用內(nèi)存的實(shí)現(xiàn)
本文主要介紹了設(shè)置Redis最大占用內(nèi)存的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
redis分布式鎖優(yōu)化的實(shí)現(xiàn)
本文主要介紹了redis分布式鎖優(yōu)化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題
這篇文章主要介紹了Redisson如何解決redis分布式鎖過期時(shí)間到了業(yè)務(wù)沒執(zhí)行完問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
基于Redis無序集合如何實(shí)現(xiàn)禁止多端登錄功能
這篇文章主要給你大家介紹了關(guān)于基于Redis無序集合如何實(shí)現(xiàn)禁止多端登錄功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Windows系統(tǒng)安裝Redis的詳細(xì)圖文教程
但有時(shí)候想在windows下折騰下Redis,那么就可以參考下面的方法了,雖然腳本之家小編以前整理了一些,發(fā)現(xiàn)這篇做的比較詳細(xì),下載也給出來了2018-08-08

