【Redis】12.Redis删除策略
生活随笔
收集整理的這篇文章主要介紹了
【Redis】12.Redis删除策略
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Redis中的數(shù)據(jù)特征
- Redis是一種內(nèi)存級數(shù)據(jù)庫,所有數(shù)據(jù)均存放在內(nèi)存中,內(nèi)存中的數(shù)據(jù)可以通過TTL指令獲取其狀態(tài)
- XX : 具有時效性的數(shù)據(jù)
- -1 : 永久有效的數(shù)據(jù)
- -2 : 已經(jīng)過期的數(shù)據(jù) 或 被刪除的數(shù)據(jù) 或 未定義的數(shù)據(jù)(可是過期的數(shù)據(jù)是立即刪除嗎?不是!)
數(shù)據(jù)刪除策略
數(shù)據(jù)刪除策略
時效性數(shù)據(jù)的存儲結(jié)構(gòu)
數(shù)據(jù)刪除策略的目標(biāo)
在內(nèi)存占用與CPU占用之間尋找一種平衡,顧此失彼都會造成整體redis性能的下降,甚至引發(fā)服務(wù)器宕機(jī)或內(nèi)存泄漏。
定時刪除
- 創(chuàng)建一個定時器,當(dāng)key設(shè)置過期時間,且過期時間到達(dá)時,由定時器任務(wù)立即執(zhí)行對鍵的刪除操作
- 優(yōu)點:節(jié)約內(nèi)存,到時就刪除,快速釋放掉不必要的內(nèi)存占用
- 缺點:CPU壓力很大,無論CPU此時負(fù)載多高,均占用CPU,會影響redis服務(wù)器響應(yīng)時間和指令吞吐量
- 總結(jié):用處理器性能換取存儲空間
惰性刪除
- 數(shù)據(jù)到達(dá)過期時間,不做處理。等下次訪問該數(shù)據(jù)
- 優(yōu)點:節(jié)約CPU性能,發(fā)現(xiàn)必須刪除的時候才刪除
- 缺點:內(nèi)存壓力很大,出現(xiàn)長期占用內(nèi)存的數(shù)據(jù)
- 總結(jié):用存儲空間換取處理器性能
以上兩種方案都走極端,但是也有折中方案
定期刪除
- Redis啟動服務(wù)器初始化時,讀取配置server.hz的值,默認(rèn)為10
- 每秒鐘執(zhí)行server.hz次serverCron()
- 周期性輪詢redis庫中時效性數(shù)據(jù),采用隨機(jī)抽取的策略,利用過期數(shù)據(jù)占比的方式刪除頻度
- 特點1:CPU性能占用設(shè)置有峰值,檢測頻度可自定義設(shè)置
- 特點2:內(nèi)存壓力不是很大,長期占用內(nèi)存的冷數(shù)據(jù)會被持續(xù)清理
- 總結(jié):周期性抽查存儲空間(隨機(jī)抽查,重點抽查)
刪除策略對比
redis中使用的是惰性刪除和定期刪除。逐出算法
新數(shù)據(jù)進(jìn)入檢測
當(dāng)新數(shù)據(jù)進(jìn)入redis時,如果內(nèi)存不足怎么辦?
- Redis使用內(nèi)存存儲數(shù)據(jù),在執(zhí)行每一個命令前,會調(diào)用freeMemorylfNeeded()檢測內(nèi)存是否充足。如果內(nèi)存不滿足新加入數(shù)據(jù)的最低存儲要求,redis要臨時刪除一些數(shù)據(jù)為當(dāng)前指令清理存儲空間。清理數(shù)據(jù)的策略稱為逐出算法。
- 注意:逐出數(shù)據(jù)的過程不是100%能夠清理出足夠的可使用的內(nèi)存空間,如果不成功則反復(fù)執(zhí)行。當(dāng)對所有數(shù)據(jù)嘗試完畢后,如果不能達(dá)到內(nèi)存清理的要求,將出現(xiàn)錯誤信息
影響數(shù)據(jù)逐出的相關(guān)配置
- 最大可使用內(nèi)存
maxmemory
占用物理內(nèi)存的比例,默認(rèn)為0,表示不限制。生產(chǎn)環(huán)境中根據(jù)需求設(shè)定,通常設(shè)置在50%以上
- 每次選取代刪除數(shù)據(jù)的個數(shù)
maxmemory-samples
選取數(shù)據(jù)時并不會全庫掃描,導(dǎo)致嚴(yán)重的性能消耗,降低讀寫性能。因此采用隨機(jī)獲取數(shù)據(jù)的方式作為待檢測刪除數(shù)據(jù)
- 刪除策略
maxmemory-policy
達(dá)到最大內(nèi)存后的,對被挑選出來的數(shù)據(jù)進(jìn)行刪除的策略
檢查易失數(shù)據(jù)(可能會過期的數(shù)據(jù)集server.db[i].expires)-推薦使用
檢測全庫數(shù)據(jù)(所有數(shù)據(jù)集server.db[i].dict)
放棄數(shù)據(jù)驅(qū)逐
- no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)(redis4.0默認(rèn)策略),會引發(fā)錯誤OOM(OutOfMemory)
配置
數(shù)據(jù)逐出策略配置依據(jù)
- 使用INFO命令輸出監(jiān)控信息,查詢緩存hit和miss的次數(shù),根據(jù)業(yè)務(wù)需求調(diào)優(yōu)Redis配置
總結(jié)
以上是生活随笔為你收集整理的【Redis】12.Redis删除策略的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Redis】11.Redis事务、事务
- 下一篇: 【Redis】13.Redis服务器配置