Redis數據淘汰策略

定時刪除

  • 策略 : 在設置鍵的過時時間的同時,建立一個定時器,讓定時器在鍵的過時時間來臨時,當即執行對鍵的刪除操做。
  • 優勢 : 對內存友好,保證過時鍵會盡量快地被刪除,並釋放過時鍵所佔用的內存。
  • 缺點 : 對CPU時間不友好,佔用太多CPU時間,影響服務器的響應時間和吞吐量。

惰性刪除

  • 策略 : 聽任過時鍵無論,每次從鍵空間讀寫操做時,都檢查鍵是否過時,若是過時,刪除該鍵,若是沒有過時,返回該鍵。
  • 優勢 : 對CPU時間友好,讀寫操做鍵時纔對鍵進行過時檢查,刪除過時鍵的操做只會在非作不可的狀況下進行。
  • 缺點 : 對內存不友好,只要鍵不刪除,就不會釋放內存,浪費太多內存,有內存泄漏風險。

按期刪除

  • 策略 :
    對定時刪除策略和惰性刪除策略的一種整合和折中。每隔一段時間執行一次定時刪除,並經過限制刪除操做執行的總時長和總頻率來限制刪除操做對CPU佔用時間的影響。經過按期刪除過時鍵,有效減小了由於過時鍵而帶來的內存浪費。
  • 難點:肯定刪除操做執行的總時長和總頻率。執行太頻繁,執行時間過長,就會退化成定時刪除策略,影響客戶端請求效率;執行得太少,執行時間過短,會演變爲惰性刪除,存在內存浪費的狀況。

Redis服務器使用惰性刪除和按期刪除兩種策略,經過配合使用,很好地在合理使用CPU時間和避免浪費內存之間取得平衡。web

  • 舉例:
  1. 從過時鍵中隨機選取 20 個 key
  2. 遍歷這 20 個 key,並對過時的 key進行刪除操做
  3. 若是過時的 key 比率超過25%,則重複步驟 1
  4. 同時,爲了保證過時掃描不會出現循環過分,致使線程卡死現象,增長了掃描時間的上限,默認不會超過 25ms以及頻次上線10次。

主動清理

當前已用內存超過maxmemory限定時,觸發主動清理策略。
清理時會根據用戶配置的maxmemory-policy來作適當的清理。
主動清理策略主要有一下六種:redis

  • volatile-lru : 從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用 的數據淘汰。
  • volatile-ttl : 從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數 據淘汰。
  • volatile-random : 從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據 淘汰。
  • allkeys-lru : 從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰。
  • allkeys-random : 從數據集(server.db[i].dict)中任意選擇數據淘汰。
  • no-enviction : 禁止驅逐數據。

做者Redis系列文章大全緩存

Redis入門
CentOS-7下安裝redis-2.8
Redis配置詳解
Redis數據淘汰策略
Redis緩存一致性問題
Redis穿透與雪崩的預防與解決方案
阻塞IO、非阻塞IO和異步IO
Redis事物探祕
Redis持久化淺析
IO多路複用及select、poll和epoll
Redis集羣-主從複製模式
Redis集羣-哨兵模式服務器