文章目錄
過期數據
Redis中的數據特徵
- Redis是一種內存級數據庫,所有數據均存放在內存中,內存中的數據可以通過TTL指令獲取其狀態。
- xx:具有時效性的數據
- -1:永久有效的數據
- -2:已經過期的數據 或 被刪除的數據 或 未定義的數據
過期的數據真的刪除了嗎?
數據刪除策略
目標
在內存佔用和CPU佔用之間尋找一種平衡,顧此失彼都會造成整體redis性能的下降,甚至引發服務器宕機或內存泄漏。
定時刪除
- 創建一個定時器,當key設置有過期時間,且過期時間到達時,由定時器任務立即執行對鍵的刪除操作。
- 優點:節約內存,快速釋放不必要的內存佔用
- 缺點:CPU壓力很大,無論CPU此時負載多高,均佔用CPU,會影響Redis服務器的響應時間和指令吞吐量
- 總結:用處理器性能換取存儲空間(拿時間換空間)
惰性刪除
當一個具有實效性的key過期後不會有刪除操作,直到下一次調用時會先檢查該key是否過期,如果過期則進行刪除操作,並返回nil(該key不存在)
- 優點:節約CPU性能,發現必須刪除的時候纔會刪除
- 缺點:內存壓力大,出現長期佔用內存的數據
- 總結:用存儲空間換取處理器性能
兩種方案都比較極端,有沒有折中的方案?
定期刪除
Redis會根據設置的參數,定期對具有時效性的key進行清理工作,它是定時刪除和惰性刪除的結合者,既不像定時刪除會立即進行刪除給予CPU壓力,也不會像惰性刪除給予內存壓力。
- Redis啓動服務器初始化時,讀取配置server.hz的值(默認爲10)
- 每秒鐘執行server.hz次serverCron()服務(serverCron【服務器級別】->databasesCron【數據庫級別】->activeExpireCyle【活躍數據級別】)
- acitveExpireCyle()對每個expires[*](數據庫)逐一進行檢測,每次執行250ms/server.hz
- 對某個expires[*]檢測時,隨機挑選w個key進行檢測
- 如果key超時,刪除key
- 如果一輪中刪除的kye的數量>w*25%,循環該過程
- 如果一輪中刪除的可以的數量<=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