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。