MemoryStore、Off-Heap Store、DiskStore

MemoryStore

始終處于啟用狀態(tài),所有元素都可以放在MemoryStore層

  • 線程安全
  • 就是使用內(nèi)存存儲(ConcurrentHashMap),很快
    所有的cache都指明了最大占用內(nèi)存,超過了
  • 如果不允許溢出內(nèi)存,存在的元素被刪除
  • 允許溢出,檢查執(zhí)行,刪除過期元素,沒過期的移到下一層。過期策略有LRU(最近最少使用)、LFU(最近使用頻率最少)、FIFO(先進先出)
    getQuiet、putQuiet 操作元素時不會更新最近使用時間和使用次數(shù),使用次數(shù)的統(tǒng)計使用AtomicLongFieldUpdater的cas操作更新

Off-Heap Store

也稱之為BigMemory,不受GC影響,可以存放超大的cache,off-heap的數(shù)據(jù)是以字節(jié)存儲的,所以元素key和value都必須序列化,get和put操作時都伴隨著序列化和反序列化的過程。MemoryStore保存了來自O(shè)ff-Heap Store使用最頻繁的數(shù)據(jù)。

DiskStore

可以當做額外的空間,系統(tǒng)重啟可以持久化緩存數(shù)據(jù)到磁盤
必須是序列化的元素才能放到DiskStore,DiskStore也是線程安全的
DiskStore的倆種策略

  • localTempSwap 在操作期間允許cache溢出到磁盤,但是系統(tǒng)重啟后會清除這類cache,可以使用maxEntriesLocalDisk or maxBytesLocalDisk來控制可以存放在磁盤的cache大小
  • localRestartable 這個策略實現(xiàn)了一個restartable store,它保存了內(nèi)存中所有的cache,重啟后,數(shù)據(jù)還是會被加載進入restartable store。

Expiry and Eviction

ehcache默認一個線程用來移除過期元素,diskExpiryThreadIntervalSeconds屬性設(shè)置過期線程跑的間隔時間,默認120s。

MemoryStore比DiskStore快一個數(shù)量級,因為DiskStore需要序列化數(shù)據(jù)、刪除過期數(shù)據(jù)、讀取數(shù)據(jù)。寫數(shù)據(jù)是由一個單獨的線程異步寫到磁盤。
建議:盡可能使用MemoryStore,當MemoryStore存不下時使用Off-Heap Store,這不會引起GC。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,963評論 0 9
  • 理論總結(jié) 它要解決什么樣的問題? 數(shù)據(jù)的訪問、存取、計算太慢、太不穩(wěn)定、太消耗資源,同時,這樣的操作存在重復性。因...
    jiangmo閱讀 3,139評論 0 11
  • 在一個方法內(nèi)部定義的變量都存儲在棧中,當這個函數(shù)運行結(jié)束后,其對應的棧就會被回收,此時,在其方法體中定義的變量將不...
    Y了個J閱讀 4,570評論 1 14
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,650評論 1 32
  • 一、簡介 Ehcache是一個用Java實現(xiàn)的使用簡單,高速,實現(xiàn)線程安全的緩存管理類庫,ehcache提供了用內(nèi)...
    小程故事多閱讀 44,491評論 9 59

友情鏈接更多精彩內(nèi)容