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對象的尷尬,一起來看一下:
前提:開啟spring緩存
@EnableCaching

要想使用spring緩存,就必須先開啟緩存:在springboot啟動項目的Java類加上此注解。

關於返回值是map,而不是Java對像的說明:
這里,我已經用紅框進行了標注,我再次用的是Map,而沒用Java實體類,並不是博主睜着眼睛說瞎話,而是我懶得改了,你把這里換成實體類,同樣會被存進redis中的;
不信自己可以試試,或在下篇文章也能找到答案,一起來看redis的存儲數據結果:

上面的x**代表的是中文字符。
下一步:怎么證明二次請求是從緩存中讀取的數據,而不是從數據庫獲取的呢?
雙管齊下:
在從數據庫獲取數據的地方加個斷點
(我現在就是以debug模式啟動的,這是一個好習慣,方便在想要調試的時候,不用再以debug模式重啟項目)

這是第一次執行方法后輸出的SQL語句(這也就證明了當時redis里是沒有這個key的)

清空控制台日志記錄,此時,我們再從前端發送一次請求,我們會發現:
既沒有走斷點,控制台也沒有SQL輸出。

這樣,就證明了:數據是從redis緩存中拿到的。
至此,就證明了通過spring原生緩存注解就能夠完成Java對象與redis存儲數據之間的自由轉化。
哪種方案更加方便,相信大家都得出了結論。這篇文章到此也就結束啦。
你可能會說:@CachePut和@CacheEvict還沒有講呢,我想說的是:這三個原生的spring緩存原生注解,其實和redis沒有任何關系,脫離了redis照樣可以使用;
反倒是redis依賴它們三個,對於我們開發來說將會方便許多;
所以,我單處寫了一篇文章,講解了它們三個如何完成對緩存庫的增刪改查,見文末推薦。
寫在最后
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!
相關推薦:
