2012-01-05 26 views
4

有人知道Redis LRU驅逐/刪除的內部結構嗎?Redis內部結構 - LRU實現抽樣

Redis如何確保先刪除較舊的(較少使用的)密鑰(如果我們沒有易失性密鑰並且我們沒有設置TTL過期)?

我知道Redis有一個配置參數「maxmemory-samples」,它控制着它用於刪除鍵的樣本大小 - 所以如果你設置一個樣本大小爲10,那麼它會對10個鍵進行採樣,在這些之中。

我不知道是否它是完全隨機抽樣這些密鑰,還是它有某種機制允許它自動從「較舊/較少使用的一代」的等價物中抽樣?

+0

據我所知,它隨機抽樣密鑰。 – 2012-01-05 08:22:43

+0

這是我在http://antirez.com/post/redis-as-LRU-cache.html找到的內容 - 使用「樣本三」算法的全部重點是節省內存。我認爲這比精確度更有價值,尤其是因爲這種隨機算法很少被人理解。一個例子:與僅有三個對象的採樣相比,* perfect * LRU算法的錯誤率僅爲14%,將會使999個數據集中的666個對象失效。 而在剩下的14%中幾乎沒有元素處於非常使用的元素範圍內。所以記憶力的增加將毫無疑問地支付精確度。 – 2012-01-05 13:39:54

+0

你應該發佈這個答案並接受它。 :-) – 2012-01-05 13:48:40

回答

5

這是我在antirez.com/post/redis-as-LRU-cache.html找到的 - 使用「樣本三」算法的全部重點是節省內存。我認爲這比精確度更有價值,尤其是因爲這種隨機算法很少被人理解。一個例子:與完美的LRU算法相比,僅使用三個對象進行採樣會使999個數據集中的666個對象失效,錯誤率僅爲14%。剩下的14%中幾乎沒有元素屬於非常常用的元素範圍。所以記憶力的增加將毫無疑問地支付精確度。因此,雖然Redis隨機採樣(意味着這不是實際的LRU ..並且作爲這樣的近似算法),但準確性相對較高,並且增加採樣大小將進一步增加這一點。但是,如果有人需要確切的LRU(對錯誤沒有容忍),那麼Redis可能不是正確的選擇。

架構...正如他們所說...是關於折衷..所以使用這個(Redis LRU)方法來折衷原始性能的準確性。