講到redis的過期刪除策略,就不得不說一下redis是如何判斷鍵是否過期,讓我們首先來了解下redis內部結構是如何儲存鍵與過期時間之間的關係
過期字典
在redisclient裡redisdb結構中儲存著乙個expires字典(key-value),專門用來儲存過期時間,如下所示:
typedef struct client client;
typedef struct redisdb redisdb;
過期字典dict的鍵是乙個指標,指向鍵物件;值是乙個long long型別的整數,儲存了其鍵的過期時間(毫秒精度的unix時間戳)
因為是字典型別key-value,所以查詢的時間複雜度為o(1),當我們需要判斷redis的鍵是否過期時,只需要從過期字典裡面取出鍵所對應的值,如果鍵不存在,則表示沒有過期;如果鍵存在,則判斷值與當前的時間戳的大小,大於當前時間戳則不過期,小於則過期;
現在讓我們來談談redis刪除策略
刪除策略
redis有三種過期刪除策略:定時刪除、惰性刪除、定期刪除
定時刪除:在設定鍵的過期時間的同時,建立timer定時器,當鍵快過期時執行刪除操作
惰性刪除:當每次獲取鍵時,檢查獲取的鍵是否過期,如果過期則刪除該鍵
定期刪除:每隔一段時間,redis就會對資料庫進行一次檢查,刪除裡面的過期鍵
優缺點這三種過期刪除策略的優缺點如下:
策略優點
缺點定時刪除
對cpu不友好,因為過期鍵較多的情況可能發生同時刪除過期鍵導致占用太多cpu時間
惰性刪除
對記憶體不友好,因為如果鍵過期了,但是沒有被訪問到,那麼就會一直存在於記憶體中,導致記憶體占用
對cpu友好,因為只有當被訪問到才會執行過期判斷與刪除
定期刪除
折中,跟刪除操作的執行時長與頻率有關
折中,跟刪除操作的執行時長與頻率有關
由此可知,三種過期刪除策略都有各自的優缺點,而定期刪除是定時刪除與惰性刪除的折中方案
目前redis伺服器採用的是惰性刪除與定期刪除兩種策略,通過配合使用更好地保證cpu時間與記憶體的平衡
redis過期策略
1 noeviction 一旦記憶體滿則返回錯誤 2 allkeys lru 對所有的key進行lru 3 volatile lru 只對設定了過期的key進行lru 預設的方式 4 allkeys random 隨機剔除乙個key 5 volatile random 對設定過期的key進行隨機剔除...
Redis過期策略
1,設定過期時間 expire key time 單位為秒 setex string key,int seconds,string value 字串獨有的方式 注意 過期key的判定 檢查給定key是否存在於過期字典,如果存在,那麼取得key的過期時間。檢查當前unix時間戳是否大於key的過期時間...
Redis 過期策略
redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。從過期字典中隨機 20 個 key 刪除這 20 個 key 中已經過期的 key 如果過期的 key 比率超過 1 4,那就重複步驟 1 同時,為了保證過期掃瞄不會出現迴圈過度,導致執行...