redis 過期鍵刪除策略

crazyCodeLove發表於2018-12-18

redis 的過期鍵的過期時間都儲存在過期字典中,過期鍵的刪除策略有3種

  • 定時刪除:在設定鍵的過期時間的同時,建立一個定時器,讓定時器在鍵的過期時間來臨時,立即刪除對鍵的刪除操作。
  • 惰性刪除:放任鍵過期不管,但每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵。如果沒有過期,就返回該鍵。
  • 定期刪除:每隔一段時間,程式對資料庫進行一次檢查,刪除裡面的過期鍵。至於刪除多少過期鍵,以及檢查多少資料庫,有演算法決定。

1 定時刪除特點

優點:對記憶體友好,通過定時器可以保證過期鍵過期鍵會盡可能快的刪除,並釋放過期鍵佔用的空間。

缺點:1)cpu不友好,在過期鍵比較多的情況下,刪除過期鍵可能會佔用相當一部分cpu時間;在記憶體不緊張cpu緊張的情況下,將cpu時間用在刪除和當前任務無關的過期鍵上,無疑會對伺服器響應時間和吞吐量造成影響。2)建立定時器需要Redis伺服器中的時間事件,而現在時間事件的實現方式是無序連結串列,查詢一個事件的時間複雜度為O(N),並不能高效的處理大量時間事件。

 

2 惰性刪除特點

優點:1)對cpu友好,程式只在取出鍵時才對建進行過期檢查,刪除的目標僅限於當前處理的鍵。

缺點:1)對記憶體不友好,當資料庫中有大量的過期鍵,而這些鍵又沒有被訪問到,那麼他們也許會永遠不會被刪除。

 

3 定期刪除:是前兩種刪除策略的一種折中。會每隔一段時間執行一次刪除過期鍵操作,並通過限制操作執行的時長和頻率來減少刪除操作對cpu時間的影響。

難點:確定刪除策略的時長和頻率

1)如果刪除操作太過頻繁,或者執行時間太長,定期刪除策略就會退化成定時刪除策略。

2)如果刪除執行得太少,或者執行時間太短,定期刪除策略又會和惰性刪除策略一樣,出現浪費記憶體現象。

 

相關文章