redis 無法儲存Java物件的兩種解決方案
1.情景展示
由上一篇,我們瞭解到redis不能直接儲存Java物件,這對於我們Java語言是非常非常不友好的,因為我們經常進行資料的操作是通過物件來完成的。如何解決這個痛點問題?
2.方案一:序列化與反序列化
因為Redis 只能支援六種資料型別(string/hash/list/set/zset/hyperloglog)的操作,導致我們無法直接將物件直接存入 Redis 記憶體中,所以在需要 Redis 儲存的六中資料型別與 Java 物件之間進行轉換;
最常見的一種替代方案就是:通過序列化和反序列化來實現,即:
我們可以把物件序列化之後存入Redis快取中,然後在取出的時候又通過轉換器,將序列化之後的物件反序列化回物件,這樣就完成了我們的要求。
序列化和反序列化聽不懂?用大白話翻譯一下:
序列化:將Java物件轉成json字串;反序列化:將json字串轉Java物件。
通過這種方式,來達到曲線救國的目的。
具體程式碼,我這裡沒有,因為這種方式我是不推薦使用的,理由是:太複雜,而且序列化和反序列化自己手動來封裝的話,也容易出問題!!!
對於redis快取的操作,還是通過注入StringRedisTemplate來完成。
3.方案二:spring註解
棄用通過StringRedisTemplate的方式操作redis,改用原生註解@CachePut,@Cacheable,@CacheEvict來操作redis;
可能你不知道,使用spring自帶的快取也是可以實現Java物件的存取,下篇文章會詳解介紹;
事實上,經過實際測試發現:通過這三個原生的快取註解,足以化解redis不能儲存Java物件的尷尬,一起來看一下:
關於返回值是map,而不是Java對像的說明:
這裡,我已經用紅框進行了標註,我再次用的是Map,而沒用Java實體類,並不是博主睜著眼睛說瞎話,而是我懶得改了,你把這裡換成實體類,同樣會被存進redis中的;
不信自己可以試試,或在下篇文章也能找到答案,一起來看redis的儲存資料結果:
上面的x**代表的是中文字元。
下一步:怎麼證明二次請求是從快取中讀取的資料,而不是從資料庫獲取的呢?
雙管齊下:
在從資料庫獲取資料的地方加個斷點
(我現在就是以debug模式啟動的,這是一個好習慣,方便在想要除錯的時候,不用再以debug模式重啟專案)
這是第一次執行方法後輸出的SQL語句(這也就證明了當時redis裡是沒有這個key的)
清空控制檯日誌記錄,此時,我們再從前端傳送一次請求,我們會發現:
既沒有走斷點,控制檯也沒有SQL輸出。
這樣,就證明了:資料是從redis快取中拿到的。
至此,就證明了通過spring原生快取註解就能夠完成Java物件與redis儲存資料之間的自由轉化。
哪種方案更加方便,相信大家都得出了結論。這篇文章到此也就結束啦。
你可能會說:@CachePut和@CacheEvict還沒有講呢,我想說的是:這三個原生的spring快取原生註解,其實和redis沒有任何關係,脫離了redis照樣可以使用;
反倒是redis依賴它們三個,對於我們開發來說將會方便許多;
所以,我單處寫了一篇文章,講解了它們三個如何完成對快取庫的增刪改查,見文末推薦。
寫在最後
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!
相關推薦: