正如上篇文章所說,ehcache採用了多級快取堆內、堆外、磁碟,每級快取容量遞增,最底層被稱為authoritative tier,其餘的快取層被稱為caching tier。authoritative tier層資料是最全的,其餘層的資料都是該層的資料子集,只是臨時儲存資料。
當caching tier容量不足時,ehcache將觸發淘汰機制,本文將詳細介紹淘汰機制的原理。
ehcache自己實現了乙個concurrenthashmap,與jvm原生的concurrenthashmap稍有不同,它實現了org.ehcache.impl.internal.concurrent.evictingconcurrentmap介面。
get時不加鎖,put時使用內建鎖,鎖的粒度在陣列中元素的維度。
本方法是獲取淘汰候選者的核心方法
public entry
getevictioncandidate
(random rndm,
int size, comparator<
?super v> prioritizer, evictionadvisor<
?super k,
?super v> evictionadvisor)
key = p.key;
val = p.val;
}while
(evictionadvisor.
adviseagainsteviction
(key, val));
if(maxkey == null || prioritizer.
compare
(val, maxvalue)
>0)
--size;
}while
(size !=0)
;int terminalindex = t.index;
while
((p = t.
advance()
)!= null && t.index == terminalindex)
}return
newconcurrenthashmap.mapentry
(maxkey, maxvalue,
this);
}else
}
prioritizer實現了comparator介面,外部傳入的prioritizer預設實現如下,即按最後訪問時間淘汰。
private
static
final comparator?>> eviction_prioritizer =
(t, u)
->
else
if(u instanceof
fault
)else
};
tieredstore類是分層快取的核心類
@override
public putstatus put
(final k key,
final v value)
throws storeacces***ception
finally
}
將key和value寫入authoritative tier層,並在caching tier層失效key。
@override
public valueholder
get(final k key)
throws storeacces***ception
catch
(storeacces***ception cae)})
;}catch
(storeacces***ception ce)
}
先從caching tier層查詢key,如果沒有則訪問authoritative tier層,更多邏輯寫在compoundcachingtier的get方法中。
@override
public store.valueholder
getorcomputeifabsent
(k key,
final function
> source)
throws storeacces***ception
return source.
(keyparam);}
catch
(storeacces***ception cae)})
;}catch
(computationexception ce)
}
此處需要呼叫到堆內、堆外層的getorcomputeifabsent邏輯
public valueholder
getorcomputeifabsent
(k key, function
> source)
throws storeacces***ception
}// 如果key-value存在,則判斷是否過期
// 如果過期就刪除此key-value鍵值對if(
!(cachedvalue instanceof
fault))
}else
} getorcomputeifabsentobserver.
end(cachingtieroperationoutcomes.getorcomputeifabsentoutcome.hit)
;return
getvalue
(cachedvalue);}
catch
(runtimeexception re)
}
protected
void
enforcecapacity()
} storeeventdispatcher.
releaseeventsink
(eventsink);}
catch
(runtimeexception re)
}
enforcecapacity方法負責檢查容量,如果超過閾值則淘汰部分key-value鍵值對。呼叫evict方法執行淘汰邏輯。
boolean
evict
(storeeventsink
eventsink)
if(candidate == null)
else
updateusageinbytesifrequired
(size()
);return null;}}
);if(removed.
get())
else
}}
例項化乙個random物件,傳入concurrenthashmap,並呼叫getevictioncandidate方法獲取淘汰候選者。
通過上面的原始碼分析,我們可以理解ehcache的快取淘汰機制,並了解ehcache自定義的concurrenthashmap類。
ehcache原始碼中大量使用了observer觀察者模式,也值得我們學習。
Ehcache快取配置
cache配置 name cache的唯一標識 maxelementsinmemory 記憶體中最大快取物件數。maxelementsondisk 磁碟中最大快取物件數,若是0表示無窮大。eternal element是否永久有效,一但設定了,timeout將不起作用。overflowtodisk ...
ehcache 快取使用
一 詳細配置步驟 1,新增ehcache.xml檔案 將ehcache.xml檔案新增到src路徑下面。ehcache.xml檔案內容如下 2,新增spring配置檔案 二 使用 1,定義ehcache工具方法 public class ehcache public cache getcache p...
Ehcache快取模式
ehcache快取模式 簡介 快取有多種不同的快取模式。以下是ehcache支援的快取模式 直接操作 direct manipulation 推送模式 pull through 自填充 self populating 直接操作 direct manipulation 你可以通過方法cache.put...