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