Redis 緩存滿了怎么辦?
首先需要明確的是,在 Redis 中,過期策略與內存淘汰策略是兩個不同的概念。過期策略是指 Redis 如何刪除已過期的鍵值對;而內存淘汰機制則是指當 Redis 占用的內存超過設定的最大值時,采用何種規(guī)則刪除部分數據,從而確保服務持續(xù)高效運行。
一、Redis 的內存上限
內存淘汰機制觸發(fā)的前提,是 Redis 使用的內存達到了預設的閾值,即配置文件中通過 maxmemory 參數設定的最大內存值。
內存淘汰的整體流程可以概括為以下步驟:

二、如何查看當前內存上限
通過執(zhí)行 config get maxmemory 命令,可以查看當前設置的最大運行內存
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"如果返回值為 0,在 64 位系統(tǒng)中代表沒有內存限制。值得注意的是,32 位系統(tǒng)默認的最大內存限制為 3GB。
三、內存淘汰策略詳解
3.1 查看當前策略
使用 config get maxmemory-policy 命令可以查詢當前生效的內存淘汰策略:
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"以上結果顯示,當前策略為 noeviction,即當內存不足時拒絕寫入新數據,但不會淘汰現有數據。
3.2 策略分類
Redis 早期版本主要支持以下 6 種淘汰策略:
- noeviction:不淘汰數據,內存不足時新寫入操作將返回錯誤(默認策略)。
- allkeys-lru:從所有鍵中淘汰最久未使用的鍵。
- allkeys-random:從所有鍵中隨機淘汰。
- volatile-lru:從設置了過期時間的鍵中淘汰最久未使用的鍵。
- volatile-random:從設置了過期時間的鍵中隨機淘汰。
- volatile-ttl:優(yōu)先淘汰過期時間更早的鍵。
自 Redis 4.0 起,新增了兩種基于使用頻率的策略:
- volatile-lfu:從設置了過期時間的鍵中淘汰使用頻率最低的鍵。
- allkeys-lfu:從所有鍵中淘汰使用頻率最低的鍵。
策略名稱中的 allkeys- 表示從全部鍵中選擇淘汰對象,而 volatile- 表示僅從設置了過期時間的鍵中選擇。
3.3 如何修改淘汰策略
調整內存淘汰策略主要有以下兩種方式,各有適用場景:
方法一:動態(tài)配置
執(zhí)行命令 config set maxmemory-policy <策略>。 優(yōu)點:立即生效,無需重啟服務。 缺點:重啟后配置會丟失。
方法二:配置文件修改
在 Redis 配置文件中設置 maxmemory-policy <策略>。 優(yōu)點:配置持久化,重啟后仍有效。 缺點:需要重啟 Redis 服務才能生效。
四、核心淘汰算法解析
除了隨機刪除與禁止刪除之外,Redis 主要實現了兩種淘汰算法:LRU 與 LFU。
4.1 LRU 算法
LRU(Least Recently Used,最近最少使用)是一種常見的緩存淘汰算法,其核心思想是:如果數據最近被訪問過,那么將來被訪問的概率也更高。
1. 算法原理
典型的 LRU 算法通常通過鏈表實現:最新訪問的元素被移到鏈表頭部,淘汰時則移除鏈表尾部的元素。
2. Redis 的近似 LRU 實現
為了平衡精度與內存開銷,Redis 并未實現嚴格的 LRU,而是采用近似 LRU 算法:在鍵對象中記錄最近一次訪問的時間戳,淘汰時隨機抽取若干鍵(默認 5 個),從中淘汰最久未被訪問的鍵。
3. 算法的局限性
LRU 算法容易受到“偶然訪問”的影響:一個長期未被訪問的鍵,如果偶然被訪問一次,就會在短期內免于被淘汰,即使其實際使用頻率很低。為此,Redis 在 4.0 版本引入了 LFU 算法。
4.2 LFU 算法
LFU(Least Frequently Used,最不經常使用)算法的淘汰依據是數據的訪問頻率,認為過去被頻繁訪問的數據未來也更可能被使用。
在 Redis 中,LFU 信息存儲在鍵對象頭中:
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS; /* 用于 LRU 時間或 LFU 數據(低 8 位存儲頻率,高 16 位存儲上次衰減時間) */
int refcount;
void *ptr;
} robj;LFU 的實現分為兩部分:
- logc(logistic counter):8 位,用于存儲訪問頻率,范圍 0~255,值越小表示使用越少,越容易被淘汰。
- ldt(last decrement time):16 位,記錄上一次頻率衰減的時間戳。
通過頻率衰減機制,LFU 能夠更好地反映數據的長期訪問熱度,避免歷史高頻訪問但近期不再使用的數據長期占據內存。
五、總結
當 Redis 緩存容量達到上限時,其行為取決于配置的內存淘汰策略。通過合理設置 maxmemory 與 maxmemory-policy,可以在內存不足時自動按規(guī)則清理數據,從而保證服務的可用性。
Redis 提供了從不淘汰到基于時間、隨機性、訪問頻率等多種策略,目前共有 8 種可選策略,默認策略 noeviction 在內存滿時會拒絕寫入操作。理解不同策略的適用場景,結合實際業(yè)務特點進行配置,是保證 Redis 高效穩(wěn)定運行的關鍵之一。






























