1. 程式人生 > >Redis的過期鍵刪除策略

Redis的過期鍵刪除策略

我們都知道資料庫鍵的過期時間都儲存在過期字典中,那麼如果一個鍵過期了,那麼什麼時候會被刪除呢?

以下三種不同的刪除策略:

  • 定時刪除: 在設定鍵的過期時間的同時,建立一個定時器(timer),讓定時器在鍵的過期時間來臨時,立即執行刪除鍵。
  • 惰性刪除:放任過期鍵不管,每次獲取鍵時,先檢查取得的鍵是否過期,如果過期,就刪除;如果沒,就返回該鍵。
  • 定期刪除:每隔一段時間,程式對資料庫進行一次檢查,刪除裡面的過期鍵。至於刪除多少過期鍵,檢查多少個數據庫,則由演算法決定。

這三種策略中,第一個和第三個是主動刪除策略,第二個是被動刪除策略。 下面我們來說明三中演算法的優缺點: 1.定時刪除

優點:這是對記憶體最友好的,通過使用定時器,可以保證過期鍵儘可能快的被刪除,並釋放所佔用的記憶體。 缺點:對CPU不友好,在過期鍵比較多的時候,刪除過期鍵操作會佔用過多CPU時間,在記憶體不緊張,CPU緊張時,把CPU的時間用在刪除和當前任務無關的過期鍵上,而不能及時響應客戶端請求,對伺服器的響應時間和吞吐量造成很大影響。 所以讓伺服器建立大量定時間,實現定時刪除策略,目前不現實

2.惰性刪除

優點:這是對CPU時間最友好的,程式只有取出鍵的時候才對鍵檢查是否刪除,這可以保證刪除過期鍵的操作只會在非做不可的情況下進行,並且刪除的目標僅限於當前處理的鍵,而不會在刪除其他無關的過期鍵上花費任何CPU時間。 缺點:對記憶體不友好,如果資料庫中有很多鍵過期了,但這些鍵又不會被訪問到,那麼就永遠不會被刪除,從而佔用很多記憶體,這可以被看作一種記憶體洩露-無用的垃圾資料佔用了大量記憶體,由於redis是記憶體資料庫,所以這不是一個好的現象。

3.定期刪除

從上面定時刪除和惰性刪除來個,各有所長,也各有缺陷。

  • 定時刪除佔用太多CPU時間,影響伺服器的響應時間和吞吐量。
  • 惰性刪除可能會浪費太多記憶體,會發生記憶體洩露危險。

所以定期策略就採用了兩者的整合和折中: 優點:

  • 定期刪除每隔一段時間執行一次刪除過期鍵操作,並通限制刪除操作執行時長和頻率減少刪除操作對CPU時間的影響。
  • 還有通過定期刪除,可以減少記憶體浪費。

但定期刪除也有缺點:難以確定刪除操作執行的時長和頻率

  • 如果刪除操作執行太頻繁,或執行時間太長,定期刪除就退化成定時刪除了,以至於浪費CPU時間在刪除過期鍵上。
  • 如果刪除操作執行的太少,或執行時間太短,又和惰性刪除一樣,出現浪費記憶體現象。

因此,採用定期刪除策略的話,伺服器需根據情況,合理地設定刪除操作的執行時長和頻率。