Redis中一個鍵過期了,什么時候會被刪除呢?有以下三種策略
定時刪除: 在設(shè)置鍵過期時間的同時,創(chuàng)建一個定時器,讓定時器在過期時間來臨時,立即執(zhí)行對鍵的刪除操作
惰性刪除:放任鍵過期不管,但是每次從鍵空間獲取鍵時,都檢查取得的鍵是否過期,過期的話就刪除該鍵,沒過期的話就返回該鍵
定期刪除:每隔一段時間,程序就對數(shù)據(jù)庫進行一次檢查,刪除里面的過期鍵,至于要刪除多少個過期鍵,檢查多少個數(shù)據(jù)庫,由算法決定
定時刪除
定時刪除策略是內(nèi)存友好的.通過定時器,定時刪除策略可以保證過期鍵會盡可能的被刪除,并釋放過期鍵所占用的內(nèi)存
缺點是對CPU時間不友好,在過期鍵較多的情況下,刪除過期鍵會占用一部分CPU時間,在內(nèi)存不緊張但CPU時間緊張的情況下,將CPU時間用在刪除和當前任務(wù)無關(guān)的過期鍵上,無疑會對服務(wù)器的響應(yīng)時間和吞吐量造成影響.
惰性刪除
惰性刪除對CPU時間是友好的,程序只有在取出鍵時會進行過期檢查,這樣可以保證刪除過期鍵操作只會在非做不可的情況下進行,并且刪除的目標僅限于當前處理的鍵,這個策略不會再刪除其他無關(guān)的過期鍵上花費任何CPU時間
缺點是對內(nèi)存最不友好的,如果一個鍵已經(jīng)過期,而這個鍵又仍然保留在數(shù)據(jù)庫中,只要這個鍵不被刪除,他所占用的內(nèi)容就不會釋放.
定期刪除
定期刪除策略是前兩種策略的整合和折中:
定期刪除策略每隔一段時間執(zhí)行一次刪除過期鍵操作,并且通過限制操作執(zhí)行的時長和頻率來減少刪除操作對CPU時間的影響.并且通過定期刪除過期鍵,有效的減少因為過期鍵而帶來的內(nèi)存浪費
定期刪除的難點是確定刪除操作執(zhí)行的時長和頻率
如果刪除操作執(zhí)行的太頻繁,或者執(zhí)行時間太長,定期刪除就會退化成定時刪除,將CPU時間過多的浪費在刪除過期鍵
如果刪除操作執(zhí)行的太少或者太短,又會和惰性刪除一樣,出現(xiàn)浪費內(nèi)存的情況
Redis所用策略
內(nèi)存淘汰機制
redis中當內(nèi)存超過限制時拷姿,按照配置的策略,淘汰掉相應(yīng)的key-value旱函,使得內(nèi)存可以繼續(xù)留有足夠的空間保存新的數(shù)據(jù)响巢。redis 確定驅(qū)逐某個鍵值對后,會刪除這個數(shù)據(jù)棒妨,并將這個數(shù)據(jù)變更消息發(fā)布到本地(AOF 持久化)和從機(主從連接)踪古。
Redis有6種策略(默認volatie-lru)
volatile-lru:使用LRU算法進行數(shù)據(jù)淘汰(淘汰上次使用時間最早的,且使用次數(shù)最少的key)券腔,只淘汰設(shè)定了有效期的key 伏穆;
allkeys-lru:使用LRU算法進行數(shù)據(jù)淘汰,所有的key都可以被淘汰纷纫;
volatile-random:隨機淘汰數(shù)據(jù)枕扫,只淘汰設(shè)定了有效期的key;
allkeys-random:隨機淘汰數(shù)據(jù)辱魁,所有的key都可以被淘汰烟瞧;
volatile-ttl:淘汰剩余有效期最短的key;
no-enviction:不刪除任意數(shù)據(jù)(但redis還會根據(jù)引用計數(shù)器進行釋放),這時如果內(nèi)存不夠時染簇,會直接返回錯誤 参滴。
LRU數(shù)據(jù)淘汰機制
在服務(wù)器配置中保存了 lru 計數(shù)器 server.lrulock,會定時(redis 定時程序 serverCorn())更新剖笙,server.lrulock 的值是根據(jù) server.unixtime 計算出來的卵洗。
在數(shù)據(jù)集中隨機挑選幾個鍵值對,取出其中 lru 最小的鍵值對淘汰。所以过蹂,你會發(fā)現(xiàn)十绑,redis并不是保證取得所有數(shù)據(jù)集中最近最少使用(LRU)的鍵值對,而只是隨機挑選的幾個鍵值對中的酷勺。
二本橙、TTL數(shù)據(jù)淘汰機制
從過期時間的表中隨機挑選幾個鍵值對,取出其中 ttl 最大的鍵值對淘汰脆诉。同樣你會發(fā)現(xiàn)甚亭,redis并不是保證取得所有過期時間的表中最快過期的鍵值對,而只是隨機挑選的幾個鍵值對中的击胜。
過期鍵刪除策略和內(nèi)存淘汰機制之間的關(guān)系:
過期鍵刪除策略強調(diào)的是對過期健的操作亏狰,如果有健過期了,而內(nèi)存還足夠偶摔,不會使用內(nèi)存淘汰機制暇唾,這時也會使用過期健刪除策略刪除過期健。
內(nèi)存淘汰機制強調(diào)的是對內(nèi)存的操作辰斋,如果內(nèi)存不夠了策州,即使有的健沒有過期,也要刪除一部分宫仗,同時也針對沒有設(shè)置過期時間的健够挂。