Redis的過期鍵刪除策略

2022-09-14 14:48:14 字數 2075 閱讀 7555

對於redis伺服器來說,記憶體資源非常寶貴,如果一些過期鍵一直不被刪除,就會造成資源浪費,

因此我們需要考慮乙個問題:如果乙個鍵過期了,它什麼時候會被刪除呢?

常見的刪除策略有以下3種:

惰性刪除:放任過期鍵不管,每次從鍵空間中獲取鍵時,檢查該鍵是否過期,如果過期,就刪除該鍵,如果沒有過期,就返回該鍵。

定期刪除:每隔一段時間,程式對資料庫進行一次檢查,刪除裡面的過期鍵,至於要刪除哪些資料庫的哪些過期鍵,則由演算法決定。

其中定時刪除和定期刪除為主動刪除策略,惰性刪除為被動刪除策略。

定時刪除策略是使用定時器。定時刪除策略可以保證過期鍵盡可能快地被刪除,並釋放過期鍵占用的記憶體。

因此,定時刪除策略的優缺點如下所示:

舉個例子,如果有大量的命令請求等待伺服器處理,並且伺服器當前不缺少記憶體,如果伺服器將大量的cpu時間用來刪除過期鍵,那麼伺服器的響應時間和吞吐量就會受到影響。

也就是說,如果伺服器建立大量的定時器,伺服器處理命令請求的效能就會降低,

因此redis目前並沒有使用定時刪除策略。

惰性刪除策略只會在獲取鍵時才對鍵進行過期檢查,不會在刪除其它無關的過期鍵花費過多的cpu時間。

因此,惰性刪除策略的優缺點如下所示:

舉個例子,如果資料庫有很多的過期鍵,而這些過期鍵又恰好一直沒有被訪問到,那這些過期鍵就會一直占用著寶貴的記憶體資源,造成資源浪費。

定期刪除策略是定時刪除策略和惰性刪除策略的一種整合折中方案。

定期刪除策略每隔一段時間執行一次刪除過期鍵操作,並通過限制刪除操作執行的時長和頻率來減少刪除操作對cpu時間的影響,同時,通過定期刪除過期鍵,也有效地減少了因為過期鍵而帶來的記憶體浪費。

redis伺服器使用的是惰性刪除策略和定期刪除策略。

過期鍵的惰性刪除策略由expireifneeded函式實現,所有讀寫資料庫的redis命令在執行之前都會呼叫expireifneeded函式對輸入鍵進行檢查:

以上描述可以使用如下流程圖表示:

過期鍵的定期刪除策略由activeexpirecycle函式實現,每當redis伺服器的週期性操作servercron函式執行時,activeexpirecycle函式就會被呼叫,它在規定的時間內,分多次遍歷伺服器中的各個資料庫,從資料庫的expires字典中隨機檢查一部分鍵的過期時間,並刪除其中的過期鍵。

activeexpirecycle函式的大體流程為:

函式每次執行時,都從一定數量的資料庫中隨機取出一定數量的鍵進行檢查,並刪除其中的過期鍵,比如先從0號資料庫開始檢查,下次函式執行時,可能就是從1號資料庫開始檢查,直到15號資料庫檢查完畢,又重新從0號資料庫開始檢查,這樣可以保證每個資料庫都被檢查到。

執行s**e命令或者bgs**e命令建立乙個新的rdb檔案時,程式會對資料庫中的鍵進行檢查,已過期的鍵不會被儲存到新建立的rdb檔案中。

舉個例子,如果資料庫中包含3個鍵k1、k2、k3,並且k2已經過期,那麼建立新的rdb檔案時,程式只會將k1和k3儲存到rdb檔案中,k2則會被忽略。

在啟動redis伺服器時,如果伺服器只開啟了rdb持久化,那麼伺服器將會載入rdb檔案:

因為主從伺服器在進行資料同步(完整重同步)的時候,從伺服器的資料庫會被清空,所以一般情況下,過期鍵對載入rdb檔案的從伺服器不會造成影響。

如果資料庫中的某個鍵已經過期,並且伺服器開啟了aof持久化功能,當過期鍵被惰性刪除或者定期刪除後,程式會向aof檔案追加一條del命令,顯式記錄該鍵已被刪除。

舉個例子,如果客戶端執行命令get message訪問已經過期的message鍵,那麼伺服器將執行以下3個動作:

從資料庫中刪除message鍵

追加一條del message命令到aof檔案

向執行get message命令的客戶端返回空回覆

在執行aof檔案重寫時,程式會對資料庫中的鍵進行檢查,已過期的鍵不會被儲存到重寫後的aof檔案中。

在主從複製模式下,從伺服器的過期鍵刪除動作由主伺服器控制:

吃水不忘挖井人:

Redis 過期鍵刪除策略

當redis伺服器中的資料庫鍵超過過期時間,刪除策略主要為三種 惰性刪除 放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,過期的話,刪除該鍵 如果沒有過期,就返回該鍵。定期刪除 每隔一段時間,程式就對資料庫進行一次檢查,刪除裡面的過期鍵。至於要刪除多少過期鍵,以及要檢查多少個資料...

redis過期鍵刪除策略

redis伺服器實際使用的過期鍵刪除策略有兩種 通過配合使用這兩種刪除策略,伺服器可以很好地合理使用cpu時間和避免浪費記憶體空間之間取得平衡。redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。從過期字典中隨機 20 個 key 刪除這 ...

Redis過期鍵刪除策略及淘汰策略

redis的所有鍵都可以設定過期策略,redis的每個設定了過期時間的key都會被放在乙個獨立的字典中,用於遍歷刪除。1.先區分兩個概念,被動刪除與主動刪除 1 被動刪除 key再被操作時,redis主動檢查key是否過期,過期則刪除 優劣 對cpu友好,只有cpu在被操作時刪除,不浪費cpu時間 ...