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 );
}
استخدام سمة key
لتحديد مفتاح ذاكرة التخزين المؤقت باستخدام البرنامج النصي SpEL.
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 إلى أنه سيتم تحميل ذاكرة التخزين المؤقت بشكل متزامن في بيئة متعددة الخيوط.
قم بإنشاء مثيل Cache
باستخدام CacheManager
:
@ 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 ));
واجهة برمجة التطبيقات غير المتزامنة:
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 );
}
}
تكوين تطبيق التمهيد الربيعي.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}
قم بزيارة التكوين التفصيلي لمزيد من التعليمات
قم بزيارة المستندات لمزيد من التفاصيل.
للترقية، راجع سجل التغيير وملاحظات التوافق.