過期時間判定
在redis內部,每當我們設定乙個鍵的過期時間時,redis就會將該鍵帶上過期時間存放到乙個過期字典中。當我們查詢乙個鍵時,redis便首先檢查該鍵是否存在過期字典中,如果存在,那就獲取其過期時間。然後將過期時間和當前系統時間進行比對,比系統時間大,那就沒有過期;反之判定該鍵過期。
過期刪除策略
redis的過期刪除策略就是:惰性刪除和定期刪除兩種策略配合使用
惰性刪除:redis的惰性刪除策略由 db.c/expireifneeded 函式實現,所有鍵讀寫命令執行之前都會呼叫 expireifneeded 函式對其進行檢查,如果過期,則刪除該鍵,然後執行鍵不存在的操作;未過期則不作操作,繼續執行原有的命令。
定期刪除:由redis.c/activeexpirecycle 函式實現,函式以一定的頻率執行,每次執行時,都從一定數量的資料庫中取出一定數量的隨機鍵進行檢查,並刪除其中的過期鍵。
注意:並不是一次執行就檢查所有的庫,所有的鍵,而是隨機檢查一定數量的鍵。
定期刪除函式的執行頻率,在redis2.6版本中,規定每秒執行10次,大概100ms執行一次。在redis2.8版本後,可以通過修改配置檔案redis.conf 的hz選項來調整這個次數。
策略優缺點對比型別
含義優點
缺點定時刪除
對cpu最不友好,在過期鍵比較多的時候,刪除過期鍵會占用一部分 cpu 時間,對伺服器的響應時間和吞吐量造成影響
惰性刪除
設定該key 過期時間後,我們不去管它,當需要該key時,我們在檢查其是否過期,如果過期,我們就刪掉它,反之返回該key
對 cpu友好,我們只會在使用該鍵時才會進行過期檢查,對於很多用不到的key不用浪費時間進行過期檢查
對記憶體不友好,如果乙個鍵已經過期,但是一直沒有使用,那麼該鍵就會一直存在記憶體中,如果資料庫中有很多這種使用不到的過期鍵,這些鍵便永遠不會被刪除,記憶體永遠不會釋放。從而造成記憶體洩漏
定期刪除
每隔一段時間,我們就對一些key進行檢查,刪除裡面過期的key
可以通過限制刪除操作執行的時長和頻率來減少刪除操作對 cpu 的影響。另外定期刪除,也能有效釋放過期鍵占用的記憶體
難以確定刪除操作執行的時長和頻率
Redis 過期鍵刪除策略
當redis伺服器中的資料庫鍵超過過期時間,刪除策略主要為三種 惰性刪除 放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,過期的話,刪除該鍵 如果沒有過期,就返回該鍵。定期刪除 每隔一段時間,程式就對資料庫進行一次檢查,刪除裡面的過期鍵。至於要刪除多少過期鍵,以及要檢查多少個資料...
Redis的過期刪除策略
過期策略 即redis針對過期的key使用的清除策略,策略為 定期刪除 惰性刪除。記憶體淘汰機制 即記憶體占用達到記憶體限制設定值時觸發的redis的淘汰策略來刪除鍵。下面是我對過期刪除策略和記憶體淘汰策略的對比 刪除策略和maxmemory關係 使用客戶端命令config set maxmemor...
redis過期鍵刪除策略
redis伺服器實際使用的過期鍵刪除策略有兩種 通過配合使用這兩種刪除策略,伺服器可以很好地合理使用cpu時間和避免浪費記憶體空間之間取得平衡。redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。從過期字典中隨機 20 個 key 刪除這 ...