JetCache は、さまざまなキャッシュ ソリューションに均一な使用法を提供する Java キャッシュ抽象化です。 Spring Cache よりも強力なアノテーションを提供します。 JetCache のアノテーションは、ネイティブ TTL、2 レベルのキャッシュをサポートし、分散環境での自動更新をサポートします。また、コードでCache
インスタンスを操作することもできます。現在、 RedisCache
、 TairCache
(github 上のオープンソースではない)、 CaffeineCache
(メモリ内)、および単純なLinkedHashMapCache
(メモリ内) の 4 つの実装があります。 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
設定されている必要があります。それ以外の場合は、index を使用して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 ベースのエビクト) に制限された 2 レベルのキャッシュ (ローカルのメモリ内キャッシュとリモート キャッシュ システム) を定義します。地図のように使用できます。
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 );
}
ポン:
< 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}
詳細な手順については、詳細構成を参照してください
詳細については、ドキュメントを参照してください。
アップグレードについては、変更履歴と互換性に関するメモを参照してください。