首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Redis 過期策略深度解析:惰性刪除與定期刪除的雙重保障機制

     編輯:Java 綜合教學

三種過期策略理論對比

策略原理優點缺點採用者
定時刪除設定定時器,到期精確刪除記憶體釋放最及時CPU 佔用高、定時器開銷大、高併發下性能崩潰無
惰性刪除讀取時檢查過期,過期則刪除CPU 友好、只處理必要鍵記憶體洩漏風險:冷鍵長期佔用Memcached
定期刪除周期性隨機抽樣檢查並刪除平衡 CPU 與記憶體、可控頻率參數調優難度大、不如定時刪除即時Redis (配合惰性)

Redis 實際採用:惰性 + 定期雙重策略

1. 惰性刪除實現

所有讀寫命令執行前調用 expireIfNeeded(key):

// 核心邏輯
if (key.expireTime != -1 && key.expireTime < currentTimeMillis()) {
    deleteKey(key);
    return null; // 命中過期鍵視同不存在
}

特別注意:SETNX 等寫命令也會觸發檢查,避免過期鍵阻礙新值寫入。

2. 定期刪除實現

核心函數 activeExpireCycle(),由 serverCron() 定時觸發 (預設 10Hz):

void activeExpireCycle() {
    for (int db = currentDb; ; db = (db + 1) % server.dbnum) {
        if (db == currentDb && loopCount > 0) break; // 掃描完一輪退出
        
        dict *expires = server.db[db].expires;
        if (dictSize(expires) == 0) continue; // 無過期鍵跳過
        
        for (int i = 0; i < 20; i++) { // 每庫固定抽樣 20 個
            if (dictSize(expires) == 0) break;
            key = dictGetRandomKey(expires);
            if (key.expireTime < now) deleteKey(key);
        }
        
        if (timeSpent > TIME_LIMIT) break; // 保護 CPU 時間片
    }
    currentDb = db; // 記錄下輪起始庫
}

關鍵配置參數

  • hz 10:serverCron 執行頻率 (Hz),影響定期刪除頻率
  • ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20:每庫每輪抽樣數
  • ACTIVE_EXPIRE_CYCLE_TIME_LIMIT:單輪 CPU 時間上限 (預設 25% CPU 時間片)

持久化對過期鍵的處理

模式RDBAOF
過期鍵不寫入快照不寫入 AOF;主動刪除時追加 DEL 指令
主從同步從節點載入 RDB 時自動過濾主節點 DEL 指令同步到從節點

與 Memcached 差異總結

Memcached 僅採用惰性刪除,Redis 雙策略在記憶體效率與 CPU 佔用間取得更好平衡,是 Redis 適合作為高效能緩存的關鍵原因之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved