JetCache 是一種 Java 快取抽象,它為不同的快取解決方案提供統一的使用方式。它提供了比 Spring Cache 中更強大的註解。 JetCache中的註解支援原生TTL,二級緩存,並在分散式環境中自動刷新,您也可以透過程式碼操作Cache
實例。目前有四種實作: RedisCache
、 TairCache
(未在 github 上開源)、 CaffeineCache
(在記憶體中)和一個簡單的LinkedHashMapCache
(在記憶體中)。 JetCache 的完整功能:
Cache
實例Cache
實例和方法級快取的存取統計信息fastjson
/ fastjson2
/ jackson
;支援的值轉換器: java
/ kryo
/ kryo5
要求:
請造訪文件以了解更多詳細資訊。
使用@Cached
註解聲明方法快取。
expire = 3600
表示元素設定後3600秒後過期。 JetCache 會自動產生帶有所有參數的快取鍵。
public interface UserService {
@ Cached ( expire = 3600 , cacheType = CacheType . REMOTE )
User getUserById ( long userId );
}
使用 SpEL 腳本使用key
屬性指定快取鍵。
public interface UserService {
@ Cached ( name = "userCache-" , key = "#userId" , expire = 3600 )
User getUserById ( long userId );
@ CacheUpdate ( name = "userCache-" , key = "#user.userId" , value = "#user" )
void updateUser ( User user );
@ CacheInvalidate ( name = "userCache-" , key = "#userId" )
void deleteUser ( long userId );
}
為了使用諸如key="#userId"
之類的參數名稱,您的 javac 編譯器目標必須是 1.8 及以上,並且應設定-parameters
。否則,使用索引來存取參數,如key="args[0]"
自動茶點:
public interface SummaryService {
@ Cached ( expire = 3600 , cacheType = CacheType . REMOTE )
@ CacheRefresh ( refresh = 1800 , stopRefreshAfterLastAccess = 3600 , timeUnit = TimeUnit . SECONDS )
@ CachePenetrationProtect
BigDecimal summaryOfToday ( long categoryId );
}
CachePenetrationProtect 註解表示在多執行緒環境下快取將被同步載入。
使用CacheManager
建立一個Cache
實例:
@ Autowired
private CacheManager cacheManager ;
private Cache < String , UserDO > userCache ;
@ PostConstruct
public void init () {
QuickConfig qc = QuickConfig . newBuilder ( "userCache" )
. expire ( Duration . ofSeconds ( 100 ))
. cacheType ( CacheType . BOTH ) // two level cache
. localLimit ( 50 )
. syncLocal ( true ) // invalidate local cache in all jvm process after update
. build ();
userCache = cacheManager . getOrCreateCache ( qc );
}
上面的程式碼建立了一個Cache
實例。 cacheType = CacheType.BOTH
定義二級快取(本地記憶體快取和遠端快取系統),本地元素上限為 50(基於 LRU 的逐出)。您可以像地圖一樣使用它:
UserDO user = userCache . get ( 12345L );
userCache . put ( 12345L , loadUserFromDataBase ( 12345L ));
userCache . remove ( 12345L );
userCache . computeIfAbsent ( 1234567L , ( key ) -> loadUserFromDataBase ( 1234567L ));
異步API:
CacheGetResult r = cache . GET ( userId );
CompletionStage < ResultData > future = r . future ();
future . thenRun (() -> {
if ( r . isSuccess ()){
System . out . println ( r . getValue ());
}
});
分散式鎖:
cache . tryLockAndRun ( "key" , 60 , TimeUnit . SECONDS , () -> heavyDatabaseOperation ());
通讀並自動刷新:
@ Autowired
private CacheManager cacheManager ;
private Cache < String , Long > orderSumCache ;
@ PostConstruct
public void init () {
QuickConfig qc = QuickConfig . newBuilder ( "userCache" )
. expire ( Duration . ofSeconds ( 3600 ))
. loader ( this :: loadOrderSumFromDatabase )
. refreshPolicy ( RefreshPolicy . newPolicy ( 60 , TimeUnit . SECONDS ). stopRefreshAfterLastAccess ( 100 , TimeUnit . SECONDS ))
. penetrationProtect ( true )
. build ();
orderSumCache = cacheManager . getOrCreateCache ( qc );
}
pom:
< dependency >
< groupId >com.alicp.jetcache</ groupId >
< artifactId >jetcache-starter-redis</ artifactId >
< version >${jetcache.latest.version}</ version >
</ dependency >
應用程式類別:
@ SpringBootApplication
@ EnableMethodCache ( basePackages = "com.company.mypackage" )
@ EnableCreateCacheAnnotation // deprecated in jetcache 2.7, can be removed if @CreateCache is not used
public class MySpringBootApp {
public static void main ( String [] args ) {
SpringApplication . run ( MySpringBootApp . class );
}
}
春季啟動 application.yml 設定:
jetcache :
statIntervalMinutes : 15
areaInCacheName : false
local :
default :
type : linkedhashmap # other choose:caffeine
keyConvertor : fastjson2 # other choose:fastjson/jackson
limit : 100
remote :
default :
type : redis
keyConvertor : fastjson2 # other choose:fastjson/jackson
broadcastChannel : projectA
valueEncoder : java # other choose:kryo/kryo5
valueDecoder : java # other choose:kryo/kryo5
poolConfig :
minIdle : 5
maxIdle : 20
maxTotal : 50
host : ${redis.host}
port : ${redis.port}
存取詳細配置以取得更多說明
請造訪文件以了解更多詳細資訊。
有關升級,請參閱變更日誌和相容性說明。