Ehcache的快取淘汰機制

2021-09-25 07:39:28 字數 3542 閱讀 5240

正如上篇文章所說,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...