JetCache는 다양한 캐싱 솔루션에 균일한 사용을 제공하는 Java 캐시 추상화입니다. Spring Cache보다 더 강력한 주석을 제공합니다. JetCache의 주석은 기본 TTL, 2단계 캐싱을 지원하고 분산 환경에서 자동으로 새로 고침되며 코드로 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 기반 제거)로 제한되는 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}
자세한 지침은 세부 구성을 참조하세요.
자세한 내용은 문서를 참조하세요.
업그레이드에 대해서는 변경 로그 및 호환성 참고 사항을 참조하세요.