redis是一種記憶體級別的資料庫,所有資料均存放在記憶體中。redis中資料可分為具有時效性的資料、永久有效的資料、已經 過期的資料或被刪除的資料或未定義的資料。
我們可以通過redis的ttl指令查詢資料的狀態:
. xx: 具有時效性的資料
. -1: 永久有效的資料
. -2: 已經過期的資料 或 被刪除的資料 或未定義的資料
實際上redis的刪除操作也需要占用redis伺服器的效能。如果redis正在高負載的工作進行刪除資料,那麼就會發生上圖可怕的情況。正是基於如此,redis才需要多種刪除策略,相互配合實現redis的過期資料刪除。
優點:節約記憶體,到時就刪除,快速釋放掉不必要的記憶體占用
缺點:cpu壓力很大。頻繁的刪除任務會占用cpu的效能,會影響redis伺服器響應時間和指令吞吐量
資料到達過期時間,不做處理。沒錯就是不理你,等下次再次訪問的時候,就直接刪除乾掉。
優點:節約cpu效能
缺點: 記憶體壓力大,出現長期占用記憶體的資料
定時刪除和惰性刪除都比較極端,而定期刪除就是比較折中的方案。
週期性輪詢redis庫中的時效性資料,採用隨機抽取的策略,利用過期資料佔比的方式控制刪除頻度。
定期刪除過程:
redis啟動伺服器初始化時,讀取配置server.hz的值,預設值為10
每秒執行server.hz次servercron( ) ---> databasecron( ) -----> activeexpirecycle( )
activeexpirecycle( )對每個資料分割槽進行逐一檢測,每次執行250ms/server.hz
對資料分割槽檢測時,隨機挑選w個key檢測:
資料分割槽中的過期資料會被刪除
如果一輪刪除過期資料的數量》w*25%,迴圈該過程
如果一輪刪除的過期資料數量<=w*25%, 檢查下乙個資料分割槽
定期刪除的特點
特點1:cpu效能占用設定有峰值,檢測頻度可自定義設定
特點2:記憶體壓力不是很大,長期占用記憶體的冷資料會被持續清理
redis是記憶體級的資料庫,當redis不斷儲存資料,資料滿了導致記憶體不足,如果再次儲存資料,怎麼辦呢?這就用到了逐出演算法。redis要臨時刪除一些資料為當前指令清理記憶體空間,清理資料的策略叫做逐出演算法。
逐出演算法的八大策略
對於易失資料:
volatile-lru :挑選最近最少使用的資料淘汰
volatile-lfu :挑選最近使用次數最少的資料淘汰
volatile-ttl :挑選將要過起的資料淘汰
***tile-random: 任意選擇資料淘汰
檢測全庫資料
allkeys-lru :挑選最近使用最少的資料淘汰
allkeys-lfu :挑選最近使用次數最少的資料淘汰
allkeys-random: 任意選擇資料淘汰
放棄資料驅逐
no-enviction 放棄驅逐
Redis 刪除策略與逐出演算法
逐出演算法 參考 優點 節約記憶體,到時就刪除,快速釋放掉不必要的記憶體占用 缺點 cpu壓力很大,無論cpu此時負載量多高,均占用cpu,會影響redis伺服器響應時間和指令吞吐量 總結 用處理器效能換取儲存空間 拿時間換空間 優點 節約cpu效能,發現必須刪除的時候才刪除 缺點 記憶體壓力很大,...
Redis刪除策略和逐出演算法
redis中的資料特徵 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 xx 具有時效性的資料 1 永久有效的資料 2 已經過期的資料 或 被刪除的資料 或 未定義的資料 資料刪除策略 1.定時刪除 2.惰性刪除 3.定期刪除 時效性資料的儲存結...
Redis快取逐出策略
把 redis 當做快取使用時,有時你可以方便的讓它在新資料時自動逐出舊資料。這一點大家都比較清楚,因為 memcached 預設也會這麼幹。redis 僅支援 lru 逐出策略。下文主要講述 redis maxmemory 指令,這個指令用於限定記憶體使用量,以及講述了redis 使用到的 lru...