1、簡介
- Redis 中的 LRU(Least Recently Used)和 LFU(Least Frequently Used)算法是用于決定在內存空間不足時,哪些鍵(key)應該被刪除以釋放空間的策略。
- 這兩種算法都試圖通過跟蹤鍵的使用情況來優化緩存的性能。
2、LRU? 算法
- LRU 是一種常用的頁面置換算法,它選擇最久未使用的頁面予以淘汰。
- 在 Redis 中,LRU 策略用于當內存達到
maxmemory
限制時,選擇哪些鍵進行刪除。然而,Redis 的 LRU 實現并不是嚴格意義上的 LRU,因為它采用了近似 LRU 算法,以節省內存和提高性能。 - Redis 的近似 LRU 算法通過隨機采樣一部分鍵,并基于這些鍵的訪問時間來決定哪些鍵最久未使用。具體來說,Redis 會為每個鍵維護一個訪問時間戳,當需要淘汰鍵時,它會隨機選擇一部分鍵,并比較這些鍵的訪問時間戳,淘汰最久未使用的鍵。
3、 LFU 算法
- LFU 是一種基于訪問頻率的頁面置換算法,它選擇訪問頻率最低的頁面予以淘汰。在 Redis 4.0 及更高版本中,引入了 LFU 淘汰策略。
- LFU 策略跟蹤每個鍵的訪問頻率,并據此決定哪些鍵應該被刪除。與 LRU 不同,LFU 不依賴于時間戳,而是根據鍵的訪問次數來判斷其“新鮮度”。
- 在 Redis 中,LFU 使用一個 8 位的計數器來記錄每個鍵的訪問頻率,每當鍵被訪問時,計數器就會增加。當需要淘汰鍵時,Redis 會選擇訪問頻率最低的鍵進行刪除。
- 為了更精確地跟蹤訪問頻率,Redis 的 LFU 計數器采用了衰減機制。如果一個鍵在一段時間內沒有被訪問,它的計數器值會逐漸減小,從而反映出該鍵的“過時”程度。
- 這種機制有助于 Redis 在淘汰鍵時更好地平衡新數據和舊數據。
4、LRU與LFU算法的區別
- LRU(Least Recently Used):最近最少使用算法,認為長時間不使用的數據在未來被使用的可能性也很小。Redis中LRU算法的實現采用了隨機抽樣的方式,提升了性能。
- LFU(Least Frequently Used):最不常用算法,根據數據的訪問頻率來決定哪些數據應當被淘汰。LFU算法更加重視元素的訪問頻率,而非最近一次訪問時間。
5、配置和使用
在 Redis 配置文件中(通常是 redis.conf
),你可以通過 maxmemory-policy
選項來設置淘汰策略。對于 LRU 和 LFU 策略,你可以分別使用以下值:
volatile-lru
:對設置了過期時間的數據使用 LRU 算法淘汰。allkeys-lru
:對所有數據使用 LRU 算法淘汰。volatile-lfu
:對設置了過期時間的數據使用 LFU 算法淘汰。allkeys-lfu
:對所有數據使用 LFU 算法淘汰。