官網:
# cache
org.springframework.boot
spring-boot-starter-cache
# 如果想要使用redis的快取,再引入redis
org.springframework.boot
spring-boot-starter-data-redis
自動配置了哪些呢?cacheautoconfiguration會匯入rediscacheconfiguration
rediscacheconfiguration為我們自動配置好了rediscachemanager
我們需要的配置
# 配置使用redis作為快取
spring.cache.type=redis
測試前,一定要先開啟快取功能 @enablecacheing
/**
* 表示當前結果需要被快取,如果快取中有,就不會呼叫,如果快取中沒有,就會呼叫方法,將方法的結果放入快取
* 注意:每乙個需要快取的資料我們都來指定要放到哪個名字的快取【快取的分割槽(按照業務型別分)】
* @return
*/@cacheable()
@override
public list
getlevel1categories()
測試結果
自定義操作
//指定快取的key,並在配置檔案中設定了過期時間
@cacheable
(value =
,key =
"'level1category'"
)@override
public list
getlevel1categories()
//經測試:現在鍵的名字變成了 category::level1category,過期時間為3600s
//這裡的key也可以使用spel表示式, 例如:#root.method.name 獲取方法的名字
//spel表示式的語法參照: -spel-context 的8.2.1章節
自定義序列規則
之前預設的式jdk序列化cacheautoconfiguration -->rediscacheconfiguration–>自動配置了rediscachemanager—>初始化所有的快取—>每個快取決定使用什麼配置—>如果rediscacheconfiguration有就用已有的,沒有就用預設的---->想改快取的配置,只需要給容器中放乙個rediscacheconfiguration即可—>就會應用到當前rediscachemanager管理的所有快取中
/**
* 配置key的序列化器以及值的序列化器
*/@enablecaching
//開啟快取功能
@configuration
public
class
mycacheconfig
}
發現新的問題,使用了我們的自定義配置後,我們之前配置類中配置的ttl時間不生效了
# spring.cache的常用配置
spring:
cache:
type: redis
redis:
time-to-live: 3600000 # 指定過期時間
key-prefix: chche_ # 如果指定了字首,如果沒有就預設使用快取得名字作為字首
use-key-prefix: true
# 是否使用字首
cache-null-values: true
# 是否快取空值,解決快取穿透問題
@cacheevict
當有更新操作時,需要刪除多個快取的時候
// 第一種方式
@caching
(evict =
)//第二種方式,刪除category分割槽下的所有快取
@cacheevict
(value =
"category"
,allentries =
true
)
儲存同乙個型別的資料,都可以指定成同乙個分割槽,就像這裡的category,分割槽名預設就是快取的字首
@cacheput
當有更新操作時,返回的資料正好也是最新的資料,也就是雙寫模式spring-cache的不足
讀模式
查詢乙個null資料。解決:快取空物件 cache-null-values: true
大量併發進來同時查詢乙個正好過期的資料。解決:加鎖 ?? @cacheable(async = true) 加鎖 解決擊穿
大量的key同時過期。解決:加隨機時間。加上過期時間寫模式(快取與資料庫一致)
總結:常規資料(讀多寫少,及時性一致性要求不高的資料),完全可以使用springcache,寫模式,只要有過期時間就足夠了。特殊資料:特殊設計
衝衝衝!!!
spring cache簡單使用
spring從3.1起自帶了cache功能。可以快取乙個方法的返回值,也就是說如果有快取,spring就會直接使用快取值,而不會再去執行這個方法 cashe相關的功能是在spring context.4.2.5.release.jar這個jar包中的。然後,開啟cache註解,配置cachemana...
使用springCache快取的步驟
org.springframework.cache.concurrent.concurrentmapcachemanager加入ioc容器,用 cachemanager會報錯.spring專案因為沒有concurrentmapcachemanage快取報錯,網上我一般沒看到有文章會說明。在配置類上加...
Spring Cache抽象 使用SpEL表示式
在spring cache註解屬性中 比如key,condition和unless spring的快取抽象使用了spel表示式,從而提供了屬性值的動態生成及足夠的靈活性。下面的 根據使用者的usercode進行快取,對於key屬性,使用了表示式自定義鍵的生成。public class userser...