詳談八大緩存清除策略
計算機(jī)科學(xué)中只有兩件難事:緩存失效和命名。-- Phil Karlton
緩存驅(qū)逐是從緩存中刪除數(shù)據(jù),以便在緩存容量達(dá)到極限時為新條目騰出空間的過程。這有時會由緩存失效觸發(fā),即從緩存中刪除不再被視為有效或新鮮的數(shù)據(jù)。
下圖顯示了最常見的緩存驅(qū)逐策略。
1.LRU(最近最少使用)
LRU 驅(qū)逐策略首先刪除最近訪問次數(shù)最少的項目。這種方法的原理是,最近訪問過的項目在不久的將來更有可能再次被訪問。LRU 可以通過哈希表和雙鏈表的組合來實現(xiàn)。
2.MRU(最近使用)
與 LRU 相反,MRU 算法首先刪除最近使用的項目。在最近訪問的項目不太可能很快再次被訪問的情況下,這種策略非常有用。不過,由于 MRU 采用了與直覺相反的緩存管理方法,因此并不常用。
3.SLRU(分段式 LRU)
SLRU 將高速緩存分為兩段:緩存段和保護(hù)段。新項目最初被放入試用段。如果緩存段中的項目再次被訪問,它就會被提升到保護(hù)段。從緩存段的 LRU 端開始驅(qū)逐,保護(hù)段中的項目會被賦予更高的優(yōu)先級,以留在緩存中。這種方法旨在將 LRU 的優(yōu)勢與保護(hù)頻繁訪問項目的附加層結(jié)合起來。
4.LFU(最不常用算法)
LFU 算法會驅(qū)逐訪問頻率最低的項目。與考慮訪問時間的 LRU 不同,LFU 側(cè)重于項目被訪問的次數(shù),因此更有利于長期重復(fù)訪問的項目。LFU 的實現(xiàn)可能比較復(fù)雜,因為它需要跟蹤訪問次數(shù),并有可能動態(tài)調(diào)整整個緩存。
5.FIFO(先進(jìn)先出)
FIFO 是最簡單的緩存策略之一,緩存以類似隊列的方式運行,先驅(qū)逐最舊的項目,而不管其訪問模式或頻率如何。雖然 FIFO 容易實現(xiàn),但它并不考慮項目的實際使用情況,因此可能導(dǎo)致緩存性能不理想。
6.TTL(生存時間)
TTL 并非嚴(yán)格意義上的驅(qū)逐算法,它是一種為每個緩存項設(shè)定特定生命周期的策略。當(dāng) TTL 過期時,該項目將被視為過時項目,并在下次訪問緩存時被自動刪除或標(biāo)記為符合驅(qū)逐條件。TTL 可與其他驅(qū)逐策略結(jié)合使用,以管理緩存的新鮮度。
7.雙層緩存
在雙層緩存策略中,第一層使用內(nèi)存緩存,第二層使用分布式緩存。第一層通常保存經(jīng)常使用的數(shù)據(jù)。
8.RR(隨機(jī)替換)
隨機(jī)替換算法隨機(jī)選擇一個緩存項并將其驅(qū)逐,為新項目騰出空間。這種方法實施起來也很簡單,不需要跟蹤訪問模式或頻率。不過,它的簡單性也帶來了代價,那就是可能純屬偶然地移除使用率高的項目。