前言
redis作為乙個快取系統,它的記憶體空間也是有限的,需要定期清理無效資料,這就需要主鍵失效和淘汰策略。redis的過期策略
我們都知道,redis是key-value資料庫,我們可以設定redis中快取的key的過期時間。redis的過期策略就是指當redis中快取的key過期了,redis如何處理。過期策略通常有以下三種:
定時過期:每個設定過期時間的key都需要建立乙個定時器,到過期時間就會立即對key進行清除。該策略可以立即清除過期的資料,對記憶體很友好;但是會占用大量的cpu資源去處理過期的資料,從而影響快取的響應時間和吞吐量。
惰性過期:只有當訪問乙個key時,才會判斷該key是否已過期,過期則清除。該策略可以最大化地節省cpu資源,卻對記憶體非常不友好。極端情況可能出現大量的過期key沒有再次被訪問,從而不會被清除,占用大量記憶體。
定期過期:每隔一定的時間,會掃瞄一定數量的資料庫的expires字典中一定數量的key,並清除其中已過期的key。該策略是前兩者的乙個折中方案。通過調整定時掃瞄的時間間隔和每次掃瞄的限定耗時,可以在不同情況下使得cpu和記憶體資源達到最優的平衡效果。
(expires字典會儲存所有設定了過期時間的key的過期時間資料,其中,key是指向鍵空間中的某個鍵的指標,value是該鍵的毫秒精度的unix時間戳表示的過期時間。鍵空間是指該redis集群中儲存的所有鍵。)
redis中同時使用了惰性過期和定期過期兩種過期策略,而memcached只是用了惰性刪除,這也是兩者的不同點redis採用的過期策略:惰性刪除+定期刪除
惰性刪除流程:
在進行get或setnx等操作時,先檢查key是否過期,定期刪除流程(簡單而言,對指定個數個庫的每乙個庫隨機刪除小於等於指定個數個過期key):若過期,刪除key,然後執行相應操作;
若沒過期,直接執行相應操作
遍歷每個資料庫(就是redis.conf中配置的"database"數量,預設為16)note:對於定期刪除,在程式中有乙個全域性變數current_db來記錄下乙個將要遍歷的庫,假設有16個庫,我們這一次定期刪除遍歷了10個,那此時的current_db就是11,下一次定期刪除就從第11個庫開始遍歷,假設current_db等於15了,那麼之後遍歷就再從0號庫開始(此時current_db==0)檢查當前庫中的指定個數個key(預設是每個庫檢查20個key,注意相當於該迴圈執行20次,迴圈體時下邊的描述)
如果當前庫中沒有乙個key設定了過期時間,直接執行下乙個庫的遍歷
隨機獲取乙個設定了過期時間的key,檢查該key是否過期,如果過期,刪除key
判斷定期刪除操作是否已經達到指定時長,若已經達到,直接退出定期刪除。
redis的記憶體淘汰策略
redis的記憶體淘汰策略是指在redis的用於快取的記憶體不足時,怎麼處理需要新寫入且需要申請額外空間的資料。redis 提供 6種資料淘汰策略:
volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰
volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
no-enviction(驅逐):禁止驅逐資料
其中的lru演算法即是【最近最少使用】
注意這裡的6種機制,volatile和allkeys規定了是對已設定過期時間的資料集淘汰資料還是從全部資料集淘汰資料,後面的lru、ttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不**的策略。
使用策略規則:
1、如果資料呈現冪律分布,也就是一部分資料訪問頻率高,一部分資料訪問頻率低,則使用allkeys-lru
2、如果資料呈現平等分布,也就是所有的資料訪問頻率都相同,則使用allkeys-random
三種資料淘汰策略:
ttl和random比較容易理解,實現也會比較簡單。主要是lru最近最少使用淘汰策略,設計上會對key 按失效時間排序,然後取最先失效的key進行淘汰
redis**演算法,實際不是嚴謹的lru演算法,而是抽樣**資料,這樣算是為了減少消耗記憶體使用,但是抽樣**的快取和全部資料**快取差異非常小,或者根本就沒有。
redis redis的過期刪除策略
世界上並沒有完美的程式,但是我們並不因此而沮喪,因為寫程式就是乙個不斷追求完美的過程。redis採用惰性刪除與定期刪除相結合的方式對過期鍵進行刪除。惰性刪除呼叫的是expireifneeded函式,每次增刪改查操作都會呼叫expireifneeded,如果鍵存在並過期則刪除。定期刪除呼叫的是acti...
Redis的過期策略
我們都知道,redis是key value資料庫,我們可以設定redis中快取的key的過期時間。redis的過期策略就是指當redis中快取的key過期了,redis如何處理。過期策略通常有以下三種 定時過期 每個設定過期時間的key都需要建立乙個定時器,到過期時間就會立即清除。該策略可以立即清除...
redis key 的過期策略
redis的key有3種過期刪除策略,具體如下 缺點 對cpu時間不友好,如果過期的key比較多時,可能會占用相當一部分cpu時間,對伺服器的響應時間和吞吐量造成影響 redis伺服器實際使用的是惰性刪除和定期刪除兩種策略 通過配合使用這兩種刪除策略,伺服器可以很好地在合理使用cpu時間和避免浪費記...