redis 資料庫相關 過期鍵的刪除策略

2021-10-03 11:30:51 字數 1229 閱讀 6928

每次從鍵空間中獲取鍵時,都檢查鍵是否過期,過期就刪除鍵。否則就返回鍵

優點:對 cpu 友好

缺點:占用已過期的鍵,但還沒被刪除的記憶體空間。

實現函式 expireifneeded,位置 db.c / expireifneeded;
流程:

get 命令流程:

每個一段時間,redis 程式對資料庫進行一次檢查,刪除過期鍵。

優點:有效減少記憶體浪費

缺點:占用部分 cpu

實現函式 activeexpirecycle,位置如下:

版本 2.8: redis.c / activeexpirecycle

版本 5.0: expire.c / activeexpirecycle

策略如下:內容**於《redis 深度歷險:核心原理與應用實踐 : 擴充套件4》

redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。

1. 從過期字典中隨機 20 個 key;

2. 刪除這 20 個 key 中已經過期的 key;

3. 如果過期的 key 比率超過 25%,那就重複步驟 1;

同時,為了保證過期掃瞄不會出現迴圈過度,導致執行緒卡死現象,演算法還增加了掃瞄時間的上限,

預設不會超過 25ms。

若 redis 例項中所有的 key 在同一時間過期了,會出現怎樣的結果?

毫無疑問,redis 會持續掃瞄過期字典 (迴圈多次),直到過期字典中過期的 key 變得稀疏,

才會停止 (迴圈次數明顯下降)。這就會導致線上讀寫請求出現明顯的卡頓現象。

導致這種卡頓的另外一種原因是記憶體管理器需要頻繁**記憶體頁,這也會產生一定的 cpu 消耗。

當客戶端請求到來時,伺服器如果正好進入過期掃瞄狀態,客戶端的請求將會等待至少 25ms 後才會進行處理,

如果客戶端將超時時間設定的比較短,比如 10ms,那麼就會出現大量的鏈結因為超時而關閉,

業務端就會出現很多異常。而且這時你還無法從 redis 的 slowlog 中看到慢查詢記錄,

因為慢查詢指的是邏輯處理過程慢,不包含等待時間。

所以業務開發人員一定要注意過期時間,如果有大批量的 key 過期,

要給過期時間設定乙個隨機範圍,而不宜全部在同一時間過期,分散過期處理的壓力。

aof

rdb

複製

Redis 資料庫鍵空間

redis 是乙個鍵值對 key value pair 資料庫伺服器,伺服器中的每個資料庫都由乙個redis.h redisdb結構表示,其中,redisdb結構的dict字典儲存了資料庫中的所有鍵值對,我們將這個字典稱為鍵空間 key space typedef struct redisdb re...

Redis多資料庫相關的概念

redis支援多個資料倉儲 16 啟動linux 啟動redis 切換到redis對應的目錄 指定配置檔案啟動redis root localhost redis bin redis server redis.conf 插卡redis是否啟動 root localhost ps ef grep i ...

redis 資料庫相關 鍵空間

版本 5.0 結構typedef struct redisdb redisdb 讀寫鍵空間時的維護操作 說明 對鍵空間執行指定的讀寫操作外,還會執行其他額外的維護操作 讀取鍵後,會根據鍵是否存在更新伺服器鍵空間命中 hit 或不命中 miss 次數,可以通過 info stat 命令中的 keysp...