Redis系列七:刪除策略

過期數據

Redis中的數據特徵

  • Redis是一種內存級數據庫,所有數據均存放在內存中,內存中的數據可以通過TTL指令獲取其狀態。
    • xx:具有時效性的數據
    • -1:永久有效的數據
    • -2:已經過期的數據 或 被刪除的數據 或 未定義的數據

過期的數據真的刪除了嗎?

數據刪除策略

目標
在內存佔用和CPU佔用之間尋找一種平衡,顧此失彼都會造成整體redis性能的下降,甚至引發服務器宕機或內存泄漏。

定時刪除

  • 創建一個定時器,當key設置有過期時間,且過期時間到達時,由定時器任務立即執行對鍵的刪除操作。
  • 優點:節約內存,快速釋放不必要的內存佔用
  • 缺點:CPU壓力很大,無論CPU此時負載多高,均佔用CPU,會影響Redis服務器的響應時間和指令吞吐量
  • 總結:用處理器性能換取存儲空間(拿時間換空間)

惰性刪除

當一個具有實效性的key過期後不會有刪除操作,直到下一次調用時會先檢查該key是否過期,如果過期則進行刪除操作,並返回nil(該key不存在)

  • 優點:節約CPU性能,發現必須刪除的時候纔會刪除
  • 缺點:內存壓力大,出現長期佔用內存的數據
  • 總結:用存儲空間換取處理器性能

兩種方案都比較極端,有沒有折中的方案?

定期刪除

Redis會根據設置的參數,定期對具有時效性的key進行清理工作,它是定時刪除和惰性刪除的結合者,既不像定時刪除會立即進行刪除給予CPU壓力,也不會像惰性刪除給予內存壓力。

  1. Redis啓動服務器初始化時,讀取配置server.hz的值(默認爲10)
  2. 每秒鐘執行server.hz次serverCron()服務(serverCron【服務器級別】->databasesCron【數據庫級別】->activeExpireCyle【活躍數據級別】)
  3. acitveExpireCyle()對每個expires[*](數據庫)逐一進行檢測,每次執行250ms/server.hz
  4. 對某個expires[*]檢測時,隨機挑選w個key進行檢測
    1. 如果key超時,刪除key
    2. 如果一輪中刪除的kye的數量>w*25%,循環該過程
    3. 如果一輪中刪除的可以的數量<=w25%檢查下一個expires[],0-15(所有的數據庫)循環

W=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
參數current_db用於記錄activeExpireCyle進入哪個expires[*]執行

刪除策略對比

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xeoKyxHs-1589562394522)(313CB2ED69D2427489507A8321AC6E97)]

數據淘汰策略

當內存到達最大內存限制時進行的數據淘汰策略

數據驅逐淘汰策略配置依據,使用info命令輸出相關監控信息,查新緩存hit 命中次數和miss的次數,根據業務調優

配置

最大可用內存:maxmemory //默認爲0,一般設置全部內存50%以上
每次選取帶刪除數據個數:maxmemory-samples //採用隨機獲取方式
刪除策略:maxmemory-policy //達到最大內存後,對被選取帶數據進行的刪除策略

檢測易失數據值(可能會過期的數據集server.db[i].expires)

  • volatile-lru:挑選最近最少使用的數據淘汰(最近數據中使用時間離當前最遠的數據)。常用
  • volatile-lfu:挑選最近使用次數最少的數據淘汰(最近數據中使用次數最少的數據)
  • volatile-ttl:挑選將要過期數據淘汰
  • volatile-random:任意挑選數據淘汰

ttl:time to live
lru:least recently used
lfu:least frequently used

檢測全庫數據(所有數據集server.db[i].dict)

  • allkeys-lru:挑選最近最少使用的數據淘汰
  • allkeys-lfu:挑選最近使用次數最少的數據淘汰
  • allkeys-random:任意挑選數據淘汰

放棄數據驅逐

no-enviction //禁止驅逐數據
4.0中默認策略,會引發OOM

服務器基本配置

  • 設置服務器守護進程方式:daemonize yes|no
  • 綁定地址:bing 127.0.0.1
  • 設置服務器端口:port 6379
  • 設置數據庫數量:databases 16
  • 設置服務器日誌級別:loglevel debug|verbose|notice|warning
  • 日誌文件名稱:logfile 端口號.log
  • 設置客戶端最大連接數:maxclients 0
  • 客戶端閒置最大等待時長:timeout 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章