網(wǎng)站建設(shè)安全級(jí)別自媒體平臺(tái)收益排行榜
這里寫(xiě)目錄標(biāo)題
- 一、Redis數(shù)據(jù)特征
- 二、過(guò)期數(shù)據(jù)
- 三、過(guò)期數(shù)據(jù)刪除策略
- 3.1 數(shù)據(jù)刪除策略的目標(biāo)
- 3.2 定時(shí)刪除
- 3.3 惰性刪除
- 3.4 定期刪除
- 3.5 刪除策略對(duì)比
- 3.6 實(shí)際應(yīng)用
- 四、數(shù)據(jù)淘汰策略
- 4.1 淘汰策略概述
- 4.2 策略配置
一、Redis數(shù)據(jù)特征
??Redis是一種內(nèi)存級(jí)數(shù)據(jù)庫(kù),所有的數(shù)據(jù)均存放在內(nèi)存中,內(nèi)存中的數(shù)據(jù)可以通過(guò)TTL指令獲取其狀態(tài)。
??TTL返回的值有三種情況:正數(shù),-1,-2
- 正數(shù):代表該數(shù)據(jù)在內(nèi)存中還能存活的時(shí)間
- -1:永久有效的數(shù)據(jù)
- 2 :已經(jīng)過(guò)期的數(shù)據(jù) 或被刪除的數(shù)據(jù) 或 未定義的數(shù)據(jù)
二、過(guò)期數(shù)據(jù)
??Redis內(nèi)部,每當(dāng)我們?cè)O(shè)置一個(gè)鍵的過(guò)期時(shí)間時(shí),Redis就會(huì)將該鍵帶上過(guò)期時(shí)間存放到一個(gè)過(guò)期字典中。
??當(dāng)我們查詢一個(gè)鍵時(shí),Redis便首先檢查該鍵是否存在過(guò)期字典中,如果存在,那就獲取其過(guò)期時(shí)間。然后將過(guò)期時(shí)間和當(dāng)前系統(tǒng)時(shí)間進(jìn)行比對(duì),比系統(tǒng)時(shí)間大,那就沒(méi)有過(guò)期;反之判定該鍵過(guò)期。
三、過(guò)期數(shù)據(jù)刪除策略
3.1 數(shù)據(jù)刪除策略的目標(biāo)
在內(nèi)存占用與CPU占用之間尋找一種平衡,顧此失彼都會(huì)造成整體redis性能的下降,甚至引發(fā)服務(wù)器宕機(jī)或 內(nèi)存泄露
針對(duì)過(guò)期數(shù)據(jù)要進(jìn)行刪除的時(shí)候都有哪些刪除策略呢?
- 1.定時(shí)刪除
- 2.惰性刪除
- 3.定期刪除
3.2 定時(shí)刪除
創(chuàng)建一個(gè)定時(shí)器,當(dāng)key設(shè)置有過(guò)期時(shí)間,且過(guò)期時(shí)間到達(dá)時(shí),由定時(shí)器任務(wù)立即執(zhí)行對(duì)鍵的刪除操作
- 優(yōu)點(diǎn):節(jié)約內(nèi)存,到時(shí)就刪除,快速釋放掉不必要的內(nèi)存占用
- 缺點(diǎn):CPU壓力很大,無(wú)論CPU此時(shí)負(fù)載量多高,均占用CPU,會(huì)影響redis服務(wù)器響應(yīng)時(shí)間和指令吞吐量
- 總結(jié):用處理器性能換取存儲(chǔ)空間(拿時(shí)間換空間)
3.3 惰性刪除
數(shù)據(jù)到達(dá)過(guò)期時(shí)間,不做處理。等下次訪問(wèn)該數(shù)據(jù)時(shí),我們需要判斷
- 如果未過(guò)期,返回?cái)?shù)據(jù)
- 發(fā)現(xiàn)已過(guò)期,刪除,返回不存在
- 優(yōu)點(diǎn):節(jié)約CPU性能,發(fā)現(xiàn)必須刪除的時(shí)候才刪除
- 缺點(diǎn):內(nèi)存壓力很大,出現(xiàn)長(zhǎng)期占用內(nèi)存的數(shù)據(jù)
- 總結(jié):用存儲(chǔ)空間換取處理器性能(拿時(shí)間換空間)
3.4 定期刪除
定時(shí)刪除和惰性刪除這兩種方案都是走的極端,那有沒(méi)有折中方案?
我們來(lái)講redis的定期刪除方案:
-
Redis啟動(dòng)服務(wù)器初始化時(shí),讀取配置server.hz的值,默認(rèn)為10
-
每秒鐘執(zhí)行server.hz次serverCron()-------->databasesCron()--------->activeExpireCycle()
-
**activeExpireCycle()**對(duì)每個(gè)expires[*]逐一進(jìn)行檢測(cè),每次執(zhí)行耗時(shí):250ms/server.hz
-
對(duì)某個(gè)expires[*]檢測(cè)時(shí),隨機(jī)挑選W個(gè)key檢測(cè)
如果key超時(shí),刪除key如果一輪中刪除的key的數(shù)量>W*25%,循環(huán)該過(guò)程如果一輪中刪除的key的數(shù)量≤W*25%,檢查下一個(gè)expires[*],0-15循環(huán)W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP屬性值
-
參數(shù)current_db用于記錄activeExpireCycle() 進(jìn)入哪個(gè)expires[*] 執(zhí)行
-
如果activeExpireCycle()執(zhí)行時(shí)間到期,下次從current_db繼續(xù)向下執(zhí)行
-
總的來(lái)說(shuō):定期刪除就是周期性輪詢r(jià)edis庫(kù)中的時(shí)效性數(shù)據(jù),采用隨機(jī)抽取的策略,利用過(guò)期數(shù)據(jù)占比的方式控制刪除頻度
-
特點(diǎn)1:CPU性能占用設(shè)置有峰值,檢測(cè)頻度可自定義設(shè)置
-
特點(diǎn)2:內(nèi)存壓力不是很大,長(zhǎng)期占用內(nèi)存的冷數(shù)據(jù)會(huì)被持續(xù)清理
-
總結(jié):周期性抽查存儲(chǔ)空間(隨機(jī)抽查,重點(diǎn)抽查)
3.5 刪除策略對(duì)比
1:定時(shí)刪除:
節(jié)約內(nèi)存,無(wú)占用,
不分時(shí)段占用CPU資源,頻度高,
拿時(shí)間換空間
2:惰性刪除:
內(nèi)存占用嚴(yán)重
延時(shí)執(zhí)行,CPU利用率高
拿空間換時(shí)間
3:定期刪除:
內(nèi)存定期隨機(jī)清理
每秒花費(fèi)固定的CPU資源維護(hù)內(nèi)存
隨機(jī)抽查,重點(diǎn)抽查
3.6 實(shí)際應(yīng)用
實(shí)際應(yīng)用場(chǎng)景Redis的過(guò)期刪除策略就是:惰性刪除+定期刪除兩種策略配合使用。
注:Redis服務(wù)器沒(méi)有使用定時(shí)刪除這種策略;
惰性刪除:Redis的惰性刪除策略由db.c/expireIfNeeded函數(shù)實(shí)現(xiàn),所有鍵讀寫(xiě)命令執(zhí)行之前都會(huì)調(diào)用expireIfNeeded函數(shù)對(duì)其進(jìn)行檢查,如果過(guò)期,則刪除該鍵,然后執(zhí)行鍵不存在的操作;未過(guò)期則不作操作,繼續(xù)執(zhí)行原有的命令。
定期刪除:由redis.c/activeExpireCycle函數(shù)實(shí)現(xiàn),函數(shù)以一定頻率執(zhí)行,每當(dāng)Redis的服務(wù)器性執(zhí)行redis.c/serverCron函數(shù)時(shí),activeExpireCycle函數(shù)就會(huì)被調(diào)用,它在規(guī)定的時(shí)間內(nèi),分多次遍歷服務(wù)器中的各個(gè)數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)的expires字典中隨機(jī)檢查一部分鍵的過(guò)期時(shí)間,并刪除其中的過(guò)期鍵
四、數(shù)據(jù)淘汰策略
4.1 淘汰策略概述
什么叫數(shù)據(jù)淘汰策略?什么樣的應(yīng)用場(chǎng)景需要用到數(shù)據(jù)淘汰策略?
當(dāng)新數(shù)據(jù)進(jìn)入redis時(shí),如果內(nèi)存不足怎么辦?在執(zhí)行每一個(gè)命令前,會(huì)調(diào)用**freeMemoryIfNeeded()**檢測(cè)內(nèi)存是否充足。如果內(nèi)存不滿足新 加入數(shù)據(jù)的最低存儲(chǔ)要求,redis要臨時(shí)刪除一些數(shù)據(jù)為當(dāng)前指令清理存儲(chǔ)空間。清理數(shù)據(jù)的策略稱(chēng)為逐出算法。
注意:逐出數(shù)據(jù)的過(guò)程不是100%能夠清理出足夠的可使用的內(nèi)存空間,如果不成功則反復(fù)執(zhí)行。當(dāng)對(duì)所有數(shù)據(jù)嘗試完畢, 如不能達(dá)到內(nèi)存清理的要求,將出現(xiàn)錯(cuò)誤信息如下
(error) OOM command not allowed when used memory >'maxmemory'
4.2 策略配置
影響數(shù)據(jù)淘汰的相關(guān)配置如下:
1:最大可使用內(nèi)存,即占用物理內(nèi)存的比例,默認(rèn)值為0,表示不限制。生產(chǎn)環(huán)境中根據(jù)需求設(shè)定,通常設(shè)置在50%以上
maxmemory ?mb
2:每次選取待刪除數(shù)據(jù)的個(gè)數(shù),采用隨機(jī)獲取數(shù)據(jù)的方式作為待檢測(cè)刪除數(shù)據(jù)
maxmemory-samples count
3:對(duì)數(shù)據(jù)進(jìn)行刪除的選擇策略
maxmemory-policy policy
那數(shù)據(jù)刪除的策略policy到底有幾種呢?一共是3類(lèi)8種
第一類(lèi):檢測(cè)易失數(shù)據(jù)(可能會(huì)過(guò)期的數(shù)據(jù)集server.db[i].expires )
volatile-lru:挑選最近最少使用的數(shù)據(jù)淘汰
volatile-lfu:挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
volatile-ttl:挑選將要過(guò)期的數(shù)據(jù)淘汰
volatile-random:任意選擇數(shù)據(jù)淘汰
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-rO91WUnz-1677378276118)(file://E:\鄧俊東學(xué)習(xí)\Redis\1.Redis高級(jí)\講義-md版本\img\lru.png?msec=1677376247604)]
第二類(lèi):檢測(cè)全庫(kù)數(shù)據(jù)(所有數(shù)據(jù)集server.db[i].dict )
allkeys-lru:挑選最近最少使用的數(shù)據(jù)淘汰
allkeLyRs-lfu::挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
allkeys-random:任意選擇數(shù)據(jù)淘汰,相當(dāng)于隨機(jī)
第三類(lèi):放棄數(shù)據(jù)驅(qū)逐
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)(redis4.0中默認(rèn)策略),會(huì)引發(fā)OOM(Out Of Memory)
注意:這些策略是配置到哪個(gè)屬性上?怎么配置?如下所示
maxmemory-policy volatile-lru
數(shù)據(jù)淘汰策略配置依據(jù)
使用INFO命令輸出監(jiān)控信息,查詢緩存 hit 和 miss 的次數(shù),根據(jù)業(yè)務(wù)需求調(diào)優(yōu)Redis配置