redis進階: 過期刪除策略
講到redis的過期刪除策略,就不得不說一下redis是如何判斷鍵是否過期,讓我們首先來了解下redis內部結構是如何儲存鍵與過期時間之間的關係
過期字典
在redisServer
結構中儲存著一個expires
字典(key-value),專門用來儲存過期時間,如下所示:
typedef struct redisDb { // 字典型別,用於儲存鍵的過期時間 dict *expires; } redisDb;
過期字典dict的鍵是一個指標,指向鍵物件;值是一個long long型別的整數,儲存了其鍵的過期時間(毫秒精度的UNIX時間戳)
因為是字典型別key-value,所以查詢的時間複雜度為O(1)
,當我們需要判斷redis的鍵是否過期時,只需要從過期字典裡面取出鍵所對應的值,如果鍵不存在,則表示沒有過期;如果鍵存在,則判斷值與當前的時間戳的大小,大於當前時間戳則不過期,小於則過期;
現在讓我們來談談redis刪除策略
刪除策略
redis有三種過期刪除策略:定時刪除
、惰性刪除
、定期刪除
-
定時刪除:在設定鍵的過期時間的同時,建立timer定時器,當鍵快過期時執行刪除操作
-
惰性刪除:當每次獲取鍵時,檢查獲取的鍵是否過期,如果過期則刪除該鍵
- 定期刪除 :每隔一段時間,redis就會對資料庫進行一次檢查,刪除裡面的過期鍵
優缺點
這三種過期刪除策略的優缺點如下:
策略 | 優點 | 缺點 |
---|---|---|
定時刪除 | 對記憶體友好,因為總是能及時刪除過期鍵 | 對CPU不友好,因為過期鍵較多的情況可能發生同時刪除過期鍵導致佔用太多CPU時間 |
惰性刪除 | 對記憶體不友好,因為如果鍵過期了,但是沒有被訪問到,那麼就會一直存在於記憶體中,導致記憶體佔用 | 對CPU友好,因為只有當被訪問到才會執行過期判斷與刪除 |
定期刪除 | 折中,跟刪除操作的執行時長與頻率有關 | 折中,跟刪除操作的執行時長與頻率有關 |
由此可知,三種過期刪除策略都有各自的優缺點,而定期刪除是定時刪除與惰性刪除的折中方案
目前redis伺服器採用的是惰性刪除與定期刪除兩種策略,通過配合使用更好地保證CPU時間與記憶體的平衡
happy coding!