淺析Java中的Caffeine緩存源碼
1. Caffenie的核心類圖

2. Caffenie緩存的分類
Caffenie從同步-異步、手工加載-自動加載、有界-無界三個維度,可以分為8中緩存類型。

3. LocalCacheFactory緩存工廠
com.github.benmanes.caffeine.cache.LocalCacheFactory#newBoundedLocalCache (只針對有界隊列)
static <K, V> BoundedLocalCache<K, V> newBoundedLocalCache(Caffeine<K, V> builder,
@Nullable CacheLoader<? super K, V> cacheLoader, boolean async) {
StringBuilder sb = new StringBuilder("com.github.benmanes.caffeine.cache.");
if (builder.isStrongKeys()) {
sb.append('S');
} else {
sb.append('W');
}
if (builder.isStrongValues()) {
sb.append('S');
} else {
sb.append('I');
}
if (builder.removalListener != null) {
sb.append('L');
}
if (builder.isRecordingStats()) {
sb.append('S');
}
if (builder.evicts()) {
sb.append('M');
if (builder.isWeighted()) {
sb.append('W');
} else {
sb.append('S');
}
}
if (builder.expiresAfterAccess() || builder.expiresVariable()) {
sb.append('A');
}
if (builder.expiresAfterWrite()) {
sb.append('W');
}
if (builder.refreshes()) {
sb.append('R');
}
try {
Class<?> clazz = LocalCacheFactory.class.getClassLoader().loadClass(sb.toString());
Constructor<?> ctor = clazz.getDeclaredConstructor(Caffeine.class, CacheLoader.class, boolean.class);
@SuppressWarnings("unchecked")
BoundedLocalCache<K, V> factory = (BoundedLocalCache<K, V>) ctor.newInstance(builder, cacheLoader, async);
return factory;
} catch (ReflectiveOperationException e) {
throw new IllegalStateException(sb.toString(), e);
}
}4. 緩存維護(hù)
com.github.benmanes.caffeine.cache.BoundedLocalCache#maintenance
/**
* Performs the pending maintenance work and sets the state flags during processing to avoid
* excess scheduling attempts. The read buffer, write buffer, and reference queues are
* drained, followed by expiration, and size-based eviction.
*
* @param task an additional pending task to run, or {@code null} if not present
*/
@GuardedBy("evictionLock")
void maintenance(@Nullable Runnable task) {
lazySetDrainStatus(PROCESSING_TO_IDLE);
try {
drainReadBuffer();
drainWriteBuffer();
if (task != null) {
task.run();
}
drainKeyReferences();
drainValueReferences();
expireEntries();
evictEntries();
climb();
} finally {
if ((drainStatus() != PROCESSING_TO_IDLE) || !casDrainStatus(PROCESSING_TO_IDLE, IDLE)) {
lazySetDrainStatus(REQUIRED);
}
}
}到此這篇關(guān)于淺析Java中的Caffeine緩存源碼的文章就介紹到這了,更多相關(guān)Caffeine緩存源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot多環(huán)境配置及配置文件分類實例詳解
這篇文章主要介紹了SpringBoot多環(huán)境配置及配置文件分類,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10
Java對象轉(zhuǎn)JSON時動態(tài)的增刪改查屬性詳解
這篇文章主要介紹了Java對象轉(zhuǎn)JSON時如何動態(tài)的增刪改查屬性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
spring cloud consul使用ip注冊服務(wù)的方法示例
這篇文章主要介紹了spring cloud consul使用ip注冊服務(wù)的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java多線程+鎖機制實現(xiàn)簡單模擬搶票的項目實踐
鎖是一種同步機制,用于控制對共享資源的訪問,在線程獲取到鎖對象后,可以執(zhí)行搶票操作,本文主要介紹了Java多線程+鎖機制實現(xiàn)簡單模擬搶票的項目實踐,具有一定的參考價值,感興趣的可以了解一下2024-02-02
SpringMvc請求處理參數(shù)?和?響應(yīng)數(shù)據(jù)處理的示例詳解
這篇文章主要介紹了SpringMvc請求處理參數(shù)和響應(yīng)數(shù)據(jù)處理,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
SpringCloud?GateWay路由網(wǎng)關(guān)與Config配置中心詳解
文章主要介紹了SpringCloud?Gateway路由網(wǎng)關(guān)的部署與配置,包括添加路由、配置路由過濾器、編寫全局過濾器等步驟,還介紹了配置中心的使用方法,包括創(chuàng)建配置中心和客戶端配置,以及CAP理論的應(yīng)用場景和特點,感興趣的朋友跟隨小編一起看看吧2026-03-03

