關(guān)于緩存的一些總結(jié)(7)

本章節(jié)講解Spring Cache
為啥要用Spring Cache組件呢?因為我們發(fā)現(xiàn)代碼中使用緩存時步驟基本上都是一樣的,首先查詢緩存,如果緩存中有直接返回數(shù)據(jù),如果緩存沒有,查詢數(shù)據(jù)庫,并給緩存中存放一份,然后返回數(shù)據(jù)。每次都是如此,有沒有一些工具類專門搞這一塊內(nèi)容呢?Java行業(yè)就是這樣,只要有需求,就有人造輪子,現(xiàn)在就講解一下這個神器--> Spring Cache
首先spring cache不是什么springboot中的什么注解,而是spring中的,而且是spring 3版本之后才支持的。
話不多說,走起!
1、引入依賴
spring-boot-starter-cache
spring-boot-starter-data-redis
2、寫配置
1)自動化配置
CacheAutoConfiguration 已經(jīng)導入了RedisCacheConfiguration,自動配置好了緩存管理器RedisCacheManager

  1. 編寫配置文件 application.properties
    spring.cache.type=redis
  2. 緩存相關(guān)注解的解釋
    @Cacheable 觸發(fā)將數(shù)據(jù)保存到緩存
    @CacheEvict 將數(shù)據(jù)從緩存中刪除
    @CachePut 在不影響方法執(zhí)行時更新緩存
    @Caching: 組合以上多個操作
    @CacheConfig: 在類級別共享緩存的相同配置
    4)測試
    1、開啟緩存功能
    在SpringBootApplication 入口類上添加@EnableCaching
    2、只需要使用注解放在需要緩存的方法上即可
    image.png

    比如在方法上寫上@Cacheable() 標注在某個方法上,該方法的返回結(jié)果變進入到緩存中,下次再方法便不會執(zhí)行該方法了。
    @Cacheable({"category"}) 括號里面的內(nèi)容相當于是給緩存分區(qū),通過名字分區(qū),我們執(zhí)行完方法查看redis,發(fā)現(xiàn)有數(shù)據(jù)
    image.png

以上就是SpringCache 的入門示例,但也存在幾點問題:
1、數(shù)據(jù)Json話存儲
2、自定義redis的key值
3、數(shù)據(jù)沒有過期時間
所以可以進一步配置:
1、如何定義key值
Cacheable注解中
@Cacheable(value={"category"},key="#root.method.name")
使用key="" 即可設(shè)置key值
2、配置過期時間
在配置文件中繼續(xù)添加:
spring.cache.redis.time-to-live=3600000 //設(shè)置過期時間1小時
3、將數(shù)據(jù)變?yōu)閖son格式比較麻煩一些,需要編寫一個配置類:MyRedisConfig.java

image.png

這樣基本上以上問題都會得以解決。
配置文件中還可以設(shè)置是否緩存空值:
spring.cache.redis.cache-null-values=true
便可以解決之前提到的緩存穿透問題。

以上問題很好地解決了緩存的讀取模式,我們?nèi)绻且戮彺妫阌玫搅诉@兩個注解:
@CacheEvict 將數(shù)據(jù)從緩存中刪除 -->可以認為是緩存的失效模式
@CachePut 在不影響方法執(zhí)行時更新緩存 -->可以認為是緩存的雙寫模式

至此我們時候從最剛開始的緩存三大問題,到現(xiàn)在,Spring Cache是否是終極方案呢?


image.png

我們發(fā)現(xiàn)SpringCache 基本上解決了緩存的三大問題,而且操作比較簡單,只是面對緩存擊穿問題,SpringCache默認是不加鎖的,即使加上了sync=true ,也只是加了本地鎖而已,那如果一個服務(wù)啟動了7個應(yīng)用,相當于有7把鎖,不過也足夠應(yīng)對大部分場景了。好了,到此結(jié)束!

特此聲明:以上文章中的很多圖都來自于網(wǎng)絡(luò),文字描述是自己的總結(jié),感謝支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容