這篇文章主要介紹redis中過期鍵刪除策略和數(shù)據(jù)逐出策略的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),會澤企業(yè)網(wǎng)站建設(shè),會澤品牌網(wǎng)站建設(shè),網(wǎng)站定制,會澤網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,會澤網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
Redis作為一個高性能的內(nèi)存NoSql數(shù)據(jù)庫,其容量受到最大內(nèi)存限制的限制。
在實際生產(chǎn)環(huán)境中使用Redis時,偶然會覺得Redis的內(nèi)存占用要比自己預(yù)想的大。事實上,Redis占用的內(nèi)存除了保存鍵值對所需的開銷外,還有一些運行時產(chǎn)生的額外內(nèi)存,包括:
過期Key所占空間
漸進式Rehash導(dǎo)致未及時刪除的空間
Redis管理數(shù)據(jù),包括底層數(shù)據(jù)結(jié)構(gòu)開銷,客戶端信息,讀寫緩沖區(qū)等
主從復(fù)制,bgsave時的額外開銷
Redis的漸進式Rehash,在筆者介紹Concurrenthashmap擴容的時候,做了簡單的介紹,點擊查看
Redis的主從復(fù)制,則在筆者的另一篇博客里做了詳細的介紹,點擊查看
所以本文將主要圍繞過期Key的回收問題進行講解。
如果Redis的一個鍵是過期的,那它到了過期時間之后并不是馬上就從內(nèi)存中被刪除,而是采用了三種不同的刪除策略:
立即刪除
惰性刪除
定時刪除
其中第二種為被動刪除,第一種和第三種為主動刪除,而且第一種實時性更高。
立即刪除是指,在設(shè)置鍵的過期時間時,創(chuàng)建一個回調(diào)事件,當(dāng)過期時間達到時,由時間處理器自動執(zhí)行鍵的刪除操作。
立即刪除能保證內(nèi)存中數(shù)據(jù)的最大新鮮度,因為它保證過期鍵值會在過期后馬上被刪除,其所占用的內(nèi)存也會隨之釋放。但是立即刪除對cpu是最不友好的。因為刪除操作會占用cpu的時間,如果剛好碰上了cpu正在做排序等計算的時候,就會給cpu造成額外的壓力。
而且目前redis事件處理器對時間事件的處理方式--無序鏈表,查找一個key的時間復(fù)雜度為O(n),所以并不適合用來處理大量的時間事件。
惰性刪除是指,某個鍵值過期后,此鍵值不會馬上被刪除,而是等到下次被使用的時候,才會被檢查到過期,此時才能得到刪除。所以惰性刪除的缺點很明顯:浪費內(nèi)存。
舉個例子,對于一些按時間點來更新的數(shù)據(jù),比如log日志,過期后在很長的一段時間內(nèi)可能都得不到訪問,這樣在這段時間內(nèi)就要浪費這么多內(nèi)存來存log。
從上面分析來看,立即刪除會短時間內(nèi)占用大量cpu,惰性刪除會在一段時間內(nèi)浪費內(nèi)存,所以定時刪除是一個折中的辦法。
定時刪除是指:每隔一段時間執(zhí)行一次刪除操作,并通過限制刪除操作執(zhí)行的時長和頻率,來減少刪除操作對cpu的影響。另一方面定時刪除也有效的減少了因惰性刪除帶來的內(nèi)存浪費。
Redis過期Key清理的機制對清理的頻率和最大時間都有限制,在盡量不影響正常服務(wù)的情況下,進行過期Key的清理,以達到長時間服務(wù)的性能最優(yōu)。
Redis會周期性的隨機測試一批設(shè)置了過期時間的key并進行處理。測試到的已過期的key將被刪除。具體的算法如下:
Redis配置項hz定義了serverCron任務(wù)的執(zhí)行周期,默認為10,即CPU空閑時每秒執(zhí)行10次;
每次過期key清理的時間不超過CPU時間的25%,即若hz=1,則一次清理時間最大為250ms,若hz=10,則一次清理時間最大為25ms;
清理時依次遍歷所有的db;
從db中隨機取20個key,判斷是否過期,若過期,則逐出;
若有5個以上key過期,則重復(fù)步驟4,否則遍歷下一個db;
在清理過程中,若達到了25%CPU時間,退出清理過程;
這是一個基于概率的簡單算法,基本的假設(shè)是抽出的樣本能夠代表整個key空間,redis持續(xù)清理過期的數(shù)據(jù)直至將要過期的key的百分比降到了25%以下。
由于算法采用的隨機取key判斷是否過期的方式,故幾乎不可能清理完所有的過期Key。
調(diào)高hz參數(shù)可以提升清理的頻率,過期key可以更及時的被刪除,但hz太高會增加CPU時間的消耗。
在redis中,允許用戶設(shè)置最大使用內(nèi)存大小maxmemory(需要配合maxmemory-policy使用),設(shè)置為0表示不限制(默認配置)。 生產(chǎn)環(huán)境中需要設(shè)置此值,最好不超過內(nèi)存60%-70%。 當(dāng)redis內(nèi)存數(shù)據(jù)集快到達maxmemory時,redis會實行數(shù)據(jù)淘汰策略。
Redis提供6種數(shù)據(jù)淘汰策略。在逐出算法中,根據(jù)用戶設(shè)置的逐出策略,選出待逐出的key,直到當(dāng)前內(nèi)存小于最大內(nèi)存值為止。
可選逐出策略如下:
volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集中挑選將要過期的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集中任意選擇數(shù)據(jù) 淘汰
allkeys-lru:從數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集中任意選擇數(shù)據(jù)淘汰
no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
在redis2.8中默認策略是volatile-lru
在redis3.2和redis4.0中默認策略是no-eviction
如果使用no-eviction時,當(dāng)內(nèi)存不足,Redis會返回OOM的錯誤信息
(error) OOM command not allowed when used memory > 'maxmemory'.
當(dāng)cache中沒有符合清除條件的key時,回收策略 volatile-lru, volatile-random 和volatile-ttl 將會和策略 noeviction 一樣直接返回錯誤。
選擇正確的回收策略是很重要的,取決于你的應(yīng)用程序的訪問模式。使用INFO命令輸出來監(jiān)控緩存命中和錯過的次數(shù),以調(diào)優(yōu)Redis的配置。
通用規(guī)則如下:
如果期望用戶請求呈現(xiàn)冪律分布(power-law distribution),也就是,期望一部分子集元素被訪問得遠比其他元素多時,可以使用allkeys-lru策略。
如果期望是循環(huán)周期的訪問,所有的鍵被連續(xù)掃描,或者期望請求符合平均分布(每個元素以相同的概率被訪問),可以使用allkeys-random策略。
如果期望是讓redis使用緩存對象設(shè)置的TTL值,確定哪些對象應(yīng)該是較好的清除候選項,可以使用volatile-ttl策略。
以上是“Redis中過期鍵刪除策略和數(shù)據(jù)逐出策略的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
                網(wǎng)頁標(biāo)題:Redis中過期鍵刪除策略和數(shù)據(jù)逐出策略的示例分析
                
                標(biāo)題鏈接:http://www.yijiale78.com/article32/gdccsc.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、定制開發(fā)、網(wǎng)站制作、軟件開發(fā)、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
