深入理解redis刪除策略和淘汰策略
1、redis的刪除策略
Redis 是一種內(nèi)存級數(shù)據(jù)庫,數(shù)據(jù)都存在內(nèi)存中,但是針對于已經(jīng)過期的數(shù)據(jù),reids 不 會立刻刪除只是會存儲在 expires 中,當(dāng)執(zhí)行刪除策略的時候,才會從 expires 中尋找對應(yīng)的數(shù)據(jù)存儲的地址,在存儲空間中找到對應(yīng)的數(shù)據(jù)進行刪除。數(shù)據(jù)刪除其實就是內(nèi)存和 CPU 占用之間尋找平衡,CPU 才能去處理事情,針對過期數(shù)據(jù),要進行刪除的時候,一般有三種策略
2、三種刪除策略
(1)、定時刪除
顧名思義,給Key設(shè)置一個時間,時間到了,定時器任務(wù)立即執(zhí)行刪除,相當(dāng)于消 耗 CPU 來減少內(nèi)存使用,拿時間換空間。
優(yōu)點:節(jié)約內(nèi)存,到時就刪除,快速釋放掉不必要的內(nèi)存占用 缺點:CPU 壓力大,無論 CPU 此時負(fù)載量多高,都會去占用 CPU 進行 key 的刪除 操作,會影響 Redis 服務(wù)器響應(yīng)時間和吞吐量,是一種比較低效的方式 結(jié)論:用 CPU 性能換取內(nèi)存空間,時間換空間
(2)、惰性刪除
就是說,數(shù)據(jù)到達過期時間的時候,先不做處理,等到下次訪問數(shù)據(jù)的時候,進行訪問, 如未過期,返回數(shù)據(jù),如過期,則刪除。這就相當(dāng)于節(jié)約了 CPU 但占用了內(nèi)存,拿空間換 時間。
優(yōu)點:不占用 CPU 節(jié)約 CPU 性能,只在獲取訪問 key 的時候才判斷是否過期,過期 則刪除,只會刪除當(dāng)前獲取的這一個 key,其他的 key 還是保持原樣
缺點:內(nèi)存占用大,如果一直沒有獲取它,那么數(shù)據(jù)就會長期占用內(nèi)存空間,當(dāng)有大量 的 key 沒有被使用到,也造成了大量內(nèi)存浪費,對內(nèi)存數(shù)據(jù)庫來說,也不太友好 結(jié)論:空間換時間
(3)、定期刪除
前面說的兩種方案 1.時間換空間,2.空間換時間都是兩個極端方法,為避免前面方案帶 來的問題,Redis 引入了定期刪除策略(是他們的一個比較折中的方案)周期性輪詢 Redis 庫中的時效性數(shù)據(jù),采取隨機抽取的策略,利用過期數(shù)據(jù)占比的方式控制刪除頻度。在 Redis 服務(wù)器初始化時,讀取 server.hz 的值,默認(rèn)值為 10。定時輪詢服務(wù)器,每秒鐘執(zhí)行 server.hz 次 serverCron() 函數(shù)。databaseCron() 在后臺輪詢處理 16 個 redis 數(shù)據(jù)庫的操作,如這里的過期key 的處理activeExpireCycle(),對每個數(shù)據(jù)庫的 expire 空間進行檢測,每次執(zhí)行250ms/server.hz 隨機選取一批 expire 空間的 key(redis 有 16 個數(shù)據(jù)庫,從 0 號數(shù)據(jù)庫開始—15號數(shù)據(jù)庫) 刪除這批 key 中已過期的。如果這批 key 中已過期的占比超過 25%,那么再重復(fù)執(zhí)行步驟一。(循環(huán)到小于 25%結(jié)束當(dāng)前數(shù)據(jù)庫的刪除)如果這批 key 中已過期的占比 ≤ 25%,檢測下一個數(shù)據(jù)庫的 expire 空間(current_db++) 用 info 命令查看相關(guān)配置參數(shù)
每秒鐘執(zhí)行 hz 次 serverCron(),對服務(wù)器進行定時輪詢
3、三種策略對比
1:定時刪除: 節(jié)約內(nèi)存,無占用, 不分時段占用 CPU 資源, 頻度高,拿時間換空間
2:惰性刪除: 內(nèi)存占用嚴(yán)重 延時執(zhí)行, CPU 利用率高拿空間換時間
3:定期刪除: 內(nèi)存定期隨機清理 每秒花費固定的 CPU 資源維護內(nèi)存 隨機抽查,重點抽查
4、淘汰/逐出策略
在 Redis 中經(jīng)常會進行數(shù)據(jù)的增刪查改操作,那么如果在添加數(shù)據(jù)的時候遇到了內(nèi)存不足,該怎么辦?在前面用的刪除策略可以避免出現(xiàn)這種情況嗎? 實際上,在前面所說的刪除策略,它針對的是 expire 命令進行的操作,也就是說那些具有時效性的數(shù)據(jù)(已經(jīng)過期,并且還在占用內(nèi)存的數(shù)據(jù)) 針對那些并沒有過期,或者是內(nèi)存中的數(shù)據(jù)沒有一個帶有有效期,全是永久性數(shù)據(jù),這時候刪除策略就不起作用了,所以這個時候內(nèi)存滿了我們再去插入數(shù)據(jù)到內(nèi)存是怎么做?那就需要用到淘汰策略了。
redis 執(zhí)行命令之前,都會用 freeMemoryIfNeeded()方法,檢測這次內(nèi)存是否充足,如果不滿足加入新數(shù)據(jù),則會執(zhí)行淘汰策略(淘汰未過期的數(shù)據(jù))
(1)、淘汰策略分類
檢測帶有時效性的數(shù)據(jù)進行淘汰(一般是有定時,會過期的數(shù)據(jù)的)
volatile-lru:挑選最近最少使用的數(shù)據(jù)淘汰
volatile-lfu:挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
volatile-ttl:挑選將要過期的數(shù)據(jù)淘汰
volatile-random:任意選擇數(shù)據(jù)淘汰
檢測全庫的數(shù)據(jù)進行淘汰
allkeys-lru:挑選最近最少使用的數(shù)據(jù)淘汰
allkeLyRs-lfu:挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
allkeys-random:任意選擇數(shù)據(jù)淘汰,相當(dāng)于隨機
到此這篇關(guān)于深入理解redis刪除策略和淘汰策略的文章就介紹到這了,更多相關(guān)redis刪除策略和淘汰策略內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis 對比 Memcached 并在 CentOS 下進行安裝配置詳解
Redis 是一個開源、支持網(wǎng)絡(luò)、基于內(nèi)存、鍵值對的 Key-Value 數(shù)據(jù)庫,本篇文章主要介紹了Redis 對比 Memcached 并在 CentOS 下進行安裝配置詳解,有興趣的可以了解一下。2016-11-11