Redis(五):過期key刪除策略

1、Redis 中 key 過期的設置

通過 EXPIRE 命令 或者 PEXPIRE 命令, 客戶端可以以秒或者毫秒精度爲數據庫中的某個鍵設置 生存時間(Time To Live,TTL),在經過指定的秒數或者毫秒數之後,服務器就會自動刪除生存時間爲 0 的鍵:

127.0.0.1:6379> setex hello 15 world 
OK
127.0.0.1:6379> ttl hello
(integer) 11
127.0.0.1:6379> ttl hello
(integer) 9
127.0.0.1:6379> ttl hello
(integer) 8
127.0.0.1:6379> ttl hello
(integer) 4
127.0.0.1:6379> ttl hello
(integer) -2


127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> expire hello 10
(integer) 1
127.0.0.1:6379> ttl hello
(integer) 6
127.0.0.1:6379> ttl hello
(integer) 3
127.0.0.1:6379> ttl hello
(integer) -2

2、過期key刪除策略

2.1、定時刪除

在設置key的過期時間的同時,爲該key創建一個定時器,讓定時器在key的過期時間來臨時,對key進行刪除

2.1.1、優點

定時刪除策略對內存是友好的,通過使用定時器,定時刪除策略可以保證過期鍵會儘可能快的被刪除,並釋放過期鍵所佔用的內存。

2.1.2、缺點

定時刪除策略對CPU是不友好的,在過期鍵比較多的情況下,刪除過期鍵可能會佔用一部分CPU時間,在內存不緊張但是CPU 緊張的情況下,將 CPU 時間用在刪除和當前任務無關的過期鍵上,無疑會對服務其的響應時間和吞吐量造成影響。

除此之外,創建一個定時器需要用到 Redis 服務器中的時間事件,而當前時間事件的實現方式 —— 無序鏈表,查找一個事件的時間複雜度爲 O(N),並不能 高效 地處 理 大量 時間 事件。

2.2、惰性刪除

每次從數據庫獲取 key 的時候去檢查是否過期,如果過期,就刪除該鍵;否則,就返回該鍵。

2.2.1、優點

惰性刪除策略對 CPU 時間是最友好的,程序會在獲取鍵時纔對鍵進行過期檢查,並且刪除的目標僅限於當前處理的鍵,這個策略不會再刪除其他無關的過期鍵上花費 CPU 時間。

2.2.2、缺點

惰性刪除策略對內存時最不友好的,如果一個鍵已經過期,只要這個鍵不被刪除,它所佔用的內存就不會被釋放。如果數據庫中有很多的過期鍵,而這些過期鍵又沒有被訪問到的話,那麼他們永遠都不會被刪除,除非手動執行 flushdb。

2.3、定期刪除

每隔一段時間,程序就對數據庫進行檢查,刪除裏面的過期鍵。

2.3.1、優點

定期刪除策略是前兩種策略的一種整合和折中:

  • 定期刪除策略每隔一段時間執行一次刪除過期鍵操作,並通過限制刪除操作執行的時長和頻率來減少刪除操作對 CPU 時間的影響。
  • 定期刪除策略有效地減少了因爲過期鍵而帶來的內存浪費。

2.3.2、缺點

  • 如果刪除操作執行的太頻繁,或者執行的時間太長,定期刪除策略就會退化成定時刪除策略,以至於將CPU時間過多的消耗再刪除過期鍵上面。
  • 如果刪除操作執行的太少,或者執行的時間太短,定期刪除策略又會和惰性刪除策略一樣,出現浪費內存的情況。

3、Redis 採用的過期鍵刪除策略

Redis 服務其使用的是惰性刪除和定期刪除兩種策略,通過配合使用這兩種刪除策略,服務其可以很好的合理利用CPU時間和避免浪費內存空間之間取得平衡。

4、RDB 持久化功能對過期鍵的處理

4.1、生成 RDB 文件

在執行SAVE 命令或者 BGSAVE 命令創建一個新的 RDB 文件時,程序會對數據庫中的鍵進行檢查,已過期的鍵不會被保存到 新創建的 RDB 文件中。

4.2、載入 RDB 文件

在啓動 Redis 服務器時,如果服務器開啓了 RDB 功能,那麼服務器將對 RDB 文件進行載入:

  • 如果服務器以主服務器模式運行,那麼在載入 RDB 文件時,程序會對文件中保存的鍵進行檢查,未過期的鍵會被載入到數據庫中,而過期鍵則會被忽略,所以過期鍵對載入RDB 文件的主服務器不會造成影響。
  • 如果服務器以從服務器模式運行,那麼在載入 RDB 文件時,文件中保存的所有鍵,不論是否過期,都會被載入到數據庫中。不過,因爲主從服務器在進行數據同步的時候,從服務器的數據庫就會被清空,所以一般來講,過期鍵對載入 RDB 文件的從服務器也不會造成影響。

5、AOF 持久化功能對過期鍵的處理

5.1、AOF 文件寫入

當服務器以 AOF 持久化模式運行時, 如果數據庫中的某個鍵已經過期,但它還沒有被惰性刪除或者定期刪除,那麼 AOF文件不會因爲這個過期鍵而產生任何 影響。 當過期鍵被惰性刪除或者定期刪除之後,程序會向 AOF 文件追加(append)一條 DEL 命令,來顯式地記錄該鍵已被刪除。

5.2、AOF 文件重寫

和生成 RDB 文件時類似,在執行 AOF 重寫的過程中,程序會對數據庫中的鍵進行檢查,已過期的鍵不會被保存到重寫後的 AOF 文件中。

6、Replication 複製對過期鍵的處理

過期刪除操作統一在 master 實例中進行並向下傳遞,而不是各 salve 各自處理。這樣一來便不會出現數據不一致的情形。

當 slave 連接到 master 後並不能立即清理已過期的 key(需要等待由master傳遞過來的DEL操作),slave 仍需對數據集中的過期狀態進行管理維護以便於在 slave 被選爲 master 時能像 master 一樣獨立的進行過期處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章