有時候,技術面試就像一場心理戰。你以為面試官在聊 Redis 緩存?其實他在考你對“內存管理”的理解。今天,我就帶你用一個小故事,輕鬆搞懂 Redis 的內存淘汰策略,讓你在面試中胸有成竹、侃侃而談!

那場面試,讓我對“Redis 淘汰策略”徹底改觀

上個月,我去參加一家金融科技公司的社招面試。面試官是個看起來不苟言笑的大哥,問的第一個問題就挺硬核:

“假設你的 Redis 已經滿了,這時候又有新數據要寫進去,會發生什麼?”

我當時心裏一咯噔:這不是考“內存淘汰策略”嘛!

但我也沒慌,笑着回道:“Redis 會根據配置的策略,決定要不要淘汰舊數據。”

面試官微微一笑,繼續追問:“那 Redis 一共有幾種淘汰策略?各自適合什麼場景?”

啊哈~果然來了。那場面試之後,我徹底總結了這道題的精髓。今天就把我的筆記、理解,還有一點點面試小心機,通通告訴你。

為什麼 Redis 會需要“淘汰策略”?

Redis 是一個基於內存的數據庫。它快,是因為所有數據都放在內存中。但問題來了:內存是有限的

舉個例子:

如果你用 Redis 做緩存,設置了 maxmemory=1GB,結果業務越來越大,一不小心就塞滿了。

這時候 Redis 必須“做決定”——要不要刪點舊的?刪哪些?於是,“內存淘汰策略”登場了。它就像 Redis 的“清理規則”,告訴 Redis:

“當內存不夠時,該優先清理哪些數據?”

Redis 的八種內存淘汰策略,一次講透!

我們常説 Redis 有 8 種淘汰策略(老版本是 6 種,後來又多了兩種)。它們的核心邏輯可以分成三大類:不淘汰、按過期時間淘汰、按訪問特徵淘汰。下面我們來講故事。

1. noeviction(默認策略)

故事背景:

  • Redis 就像一個固執的倉庫管理員。倉庫爆滿了,但他就是不想扔東西。
  • 你再塞新貨進來?對不起,直接報錯!

解釋:

在 noeviction 模式下,Redis 不會刪除任何數據。當內存不足時:

  • 讀操作沒問題;
  • 但寫操作(包括 set、incr 等)會直接返回錯誤。

適用場景:

  • 數據不可丟的情況,比如金融賬單、配置緩存等。
  • 不過這種策略一般只適合嚴格控制內存的系統,否則可能引發應用報錯甚至崩潰。

2. volatile-lru(過期鍵 + LRU 算法)

故事背景:

  • Redis 像個聰明的倉管員,只在“設置了過期時間的貨物”中挑選最久沒被訪問的扔掉。

解釋:

  • LRU(Least Recently Used)是“最近最少使用”算法。
  • 意思是:誰最久沒被碰過,誰先走。
  • 但 volatile-lru 有限制——只在“設置了過期時間”的鍵中生效。

適用場景:

  • 一般用於緩存場景,尤其是隻給部分數據設置了 TTL(過期時間)的系統。

3. volatile-ttl(過期鍵 + TTL 倒計時)

故事背景:

  • Redis 這次不看訪問頻率,只看“保質期”。
  • 哪個商品離過期時間最近,就優先清掉。

解釋:

  • 在設置了過期時間的鍵中,Redis 會優先刪除快要到期的鍵。

適用場景:

  • 適合對時效性敏感的業務,比如短視頻的熱度榜、秒殺庫存等。

4. volatile-random(過期鍵 + 隨機刪除)

故事背景:

  • 這位倉庫管理員有點隨性。
  • 他只在“有過期時間”的貨物堆裏隨手挑幾個扔。

解釋:

  • 當內存不夠時,從帶過期時間的鍵裏隨機挑選刪除。
  • 簡單粗暴,但不可預測。

適用場景:

  • 不太推薦,除非測試環境或業務邏輯允許隨機刪除。

5. allkeys-lru(所有鍵 + LRU 算法)

故事背景:

  • Redis 這次下了狠心:無論有沒有過期時間,只要最久沒被訪問的,都要淘汰。

解釋:

  • 這是最常用的策略之一!
  • Redis 在所有鍵中,優先刪除“最近最少使用”的數據。

適用場景:

  • 適合絕大多數緩存業務,比如熱點新聞、商品詳情緩存、首頁推薦等。
  • 因為這些數據隨時都能重新加載。

6. allkeys-random(所有鍵 + 隨機刪除)

故事背景:

  • 管理員又開始任性了,這次是所有貨物中隨機挑選一些扔掉。

解釋:

  • 所有鍵都有可能被刪除,不管有沒有過期時間。

適用場景:

  • 小型系統或測試環境。
  • 但生產環境一般不建議,畢竟可能刪掉熱門數據。

7. volatile-lfu(過期鍵 + LFU 算法)

故事背景:

  • Redis 升級了倉管系統,裝了一個統計器。
  • 它不看時間,只看訪問頻率——誰最不受歡迎,就刪誰。

解釋:

  • LFU(Least Frequently Used)算法:刪除訪問頻率最低的鍵。
  • 但只作用於帶過期時間的鍵。

適用場景:

  • 適合流量分佈極度不均的場景,比如熱點商品緩存。

8. allkeys-lfu(所有鍵 + LFU 算法)

故事背景:

  • 這是 Redis 4.0 之後的新寵。
  • 它既公平又高效,不分過期時間,直接根據訪問頻率決定淘汰。

解釋:

  • 訪問頻率低的數據優先被清除。
  • 比 LRU 更精確,因為它能避免“剛被訪問一次”的誤判。

適用場景:

  • 推薦生產環境使用,尤其是大規模高併發緩存系統。
  • 比如:短視頻推薦、社交熱帖、搜索聯想詞等。

説了這麼多,別急,我們來用一張表看清楚,Redis 八大淘汰策略,一目瞭然:

別再死記八種策略了!Redis 淘汰機制其實超簡單!_Redis

怎麼配置 Redis 的淘汰策略?

在 Redis 配置文件 redis.conf 中,有一個關鍵參數:

maxmemory-policy allkeys-lru

這行配置就是決定 Redis 淘汰策略的關鍵。如果不配置,默認是 noeviction。另外還要注意設置:

maxmemory 512mb

否則 Redis 根本不會觸發淘汰機制。

那面試官又問了:“你怎麼選擇合適的策略?”

這是面試中最容易被問“懵”的一環。我給你一個萬能回答模板,穩得一批:

“具體要根據業務場景決定:

如果是純緩存系統:推薦 allkeys-lru 或 allkeys-lfu;

如果部分數據設置了過期時間:用 volatile-lru;

如果數據不允許被刪:noeviction;

如果需要控制時效:volatile-ttl;

其他策略(random)僅用於測試或特殊情況。”

面試官最愛聽的補充點:

“Redis 4.0 之後推薦使用 LFU,它能更精確反映訪問熱度,避免 LRU 的時間偏差問題。”

這句話説完,分數就上去了!

深入理解:LRU vs LFU 的區別

很多人答題只記得名字,卻講不清兩者差異。

  • LRU:關注“最近是否被訪問”
  • LFU:關注“被訪問的次數”

舉個例子:

別再死記八種策略了!Redis 淘汰機制其實超簡單!_Redis_02

  • 在 LRU 規則下,會刪掉 A(因為最近沒被訪問)。
  • 但在 LFU 規則下,會刪掉 B(因為訪問次數太少)。

面試官考點就在這裏:

你是否理解算法背後的邏輯——Redis 是在平衡“時間”和“熱度”的取捨。

再補一句:Redis 淘汰策略 ≠ 過期刪除

有些同學容易混淆“過期刪除機制”和“淘汰策略”,我一定要強調:

  • 過期刪除機制:針對設置了 TTL 的鍵,分為惰性刪除 + 定期刪除;
  • 內存淘汰策略:針對整體內存滿的場景,Redis 主動刪鍵。

兩者雖然都在“刪除”,但觸發條件完全不同。這是面試中加分的隱藏點!

面試官最後笑了:“那你説説,你的 Redis 怎麼調優?”

我説:

“我一般會先設置合理的 maxmemory,再選擇 allkeys-lfu 策略,同時配合監控內存使用率。熱點數據通過 TTL 控制,冷數據交給 Redis 自動淘汰。”

面試官點了點頭,笑道:

“不錯,看來 Redis 不只是‘記憶’,還是一門‘哲學’。”

我也笑了。確實,Redis 的淘汰策略,本質上是如何在有限資源裏,做最聰明的取捨。

最後總結:面試時這樣答最穩!

面試時,可以這樣組織回答結構:

Redis 提供 8 種內存淘汰策略,分三類:

不淘汰: noeviction(默認);

只淘汰過期鍵: volatile-lru、volatile-ttl、volatile-random、volatile-lfu;

淘汰所有鍵: allkeys-lru、allkeys-random、allkeys-lfu。

其中最常用的是 allkeys-lruallkeys-lfu,前者基於最近最少使用,後者基於最少訪問頻率。

在生產中建議根據業務特點選擇,並配合合理的 TTL 和監控策略使用。

這時候,你不只是答題,更像一個能落地、懂系統的工程師。相信我,這種答法,面試官都會點頭!

END

Redis 的內存淘汰策略,其實很像我們自己的生活哲學。內存有限,選擇就變得重要。要麼珍惜常用的、要麼捨棄無用的。

Redis 教會我們的,不只是技術,更是一種取捨的智慧。

我是小米,一個喜歡分享技術的31歲程序員。如果你喜歡我的文章,歡迎關注我的微信公眾號“軟件求生”,獲取更多技術乾貨!