Redis的過期鍵的過期時間都保存在過期字典中,過期鍵的刪除策略有三種,分別是定時刪除、惰性刪除和定期刪除。
定時刪除
定時刪除策略,是指在設置鍵的過期時間的同時,創建一個定時器,讓定時器在鍵的過期時間到的時候,立即執行對鍵的刪除操作。
定時刪除策略的優點
對內存友好,通過定時器可以保證過期鍵能盡可能快地被刪除,並釋放過期鍵占用的空間。
定時刪除策略的缺點
1.對CPU不友好。在過期鍵較多的情況下,刪除過期鍵可能會占用相當一部分的CPU執行時間。在內存不緊張而CPU緊張的情況下,將CPU資源用在刪除和當前任務無關的過期鍵上,無疑也會對服務器的響應時間和吞吐量造成影響。
2.創建定時器需要Redis服務器中的時間事件,而現在時間事件的實現方式是無序鏈表,查找一個事件的事件復雜度為O(N),並不能高效地處理大量時間事件。
惰性刪除
惰性刪除策略,是指放任鍵過期不管,每次從鍵空間獲取鍵的時候才去檢查取得的鍵是否過期,如果過期的話,就刪除該鍵,如果不過期,就返回該鍵。
惰性刪除策略的優點
對CPU友好,程序只在取出鍵時才對鍵進行過期檢查,刪除的目標進行預當前處理的鍵。
惰性刪除策略的缺點
惰性刪除策略對內存不友好,當數據庫中有大量的過期鍵,而這些鍵又沒有被訪問到,那么它們可能因為永遠都不會被進行過期檢查而被刪除。
定期刪除
定期刪除策略,是指每隔一段時間,程序就會對數據庫進行一次檢查,刪除里面的過期鍵。至於刪除多少過期鍵,以及檢查多少數據庫,都由算法來決定。這種策略是前面兩種刪除策略(定時刪除、惰性刪除)的一種折衷,它會通過限制操作執行的時長和頻率來減少刪除操作對CPU執行時間的影響,而確定刪除策略的時長和頻率就是主要難點。
定期刪除策略的難點
1.如果刪除操作太頻繁,或者執行時間過長,定期刪除策略就會退化成定時刪除策略。
2.如果刪除操作執行得太少,或者執行時間太短,定期刪除策略又會和惰性刪除策略一樣,出現內存浪費的現象。
總結
這三種策略,第一種策略(定時刪除)和第三種策略(定期刪除)可以歸類為主動刪除策略,第二種策略(惰性刪除)則是被動刪除策略。Redis服務器實際使用的是惰性刪除+定期刪除兩種策略的一個配合使用。通過這兩種策略的配合使用,服務器就可以很好地在【合理使用CPU時間】和【避免浪費內存空間】之間取得平衡。
"第一次遇見你其實沒什么特別,也不會想到后來會那么喜歡你。"