天天看點

redis學習筆記(6):資料過期和淘汰政策:

Redis記憶體淘汰指的是使用者存儲的一些鍵被可以被Redis主動地從執行個體中删除,進而産生讀miss的情況,目的是為了更好地使用記憶體,用一定的緩存miss來換取記憶體的使用效率。

1清理時機

為了防止一次性清理大量過期Key導緻Redis服務受影響,Redis隻在空閑時清理過期Key。

Redis過期Key清理的機制對清理的頻率和最大時間都有限制,在盡量不影響正常服務的情況下,進行過期Key的清理,以達到長時間服務的性能最優.

Redis會周期性的随機測試一批設定了過期時間的key并進行處理。測試到的已過期的key将被删除。具體的算法如下:

  1. Redis配置項hz定義了serverCron任務的執行周期,預設為10,即CPU空閑時每秒執行10次;
  2. 每次過期key清理的時間不超過CPU時間的25%,即若hz=1,則一次清理時間最大為250ms,若hz=10,則一次清理時間最大為25ms;
  3. 清理時依次周遊所有的db;
  4. 從db中随機取20個key,判斷是否過期,若過期,則逐出;
  5. 若有5個以上key過期,則重複步驟4,否則周遊下一個db;
  6. 在清理過程中,若達到了25%CPU時間,退出清理過程;

這是一個基于機率的簡單算法,基本的假設是抽出的樣本能夠代表整個key空間,redis持續清理過期的資料直至将要過期的key的百分比降到了25%以下。這也意味着在長期來看任何給定的時刻已經過期但仍占據着記憶體空間的key的量最多為每秒的寫操作量除以4.随機的算法也意味着幾乎不能清除所有的過期key.

2參數設定:maxmemory 

1  用戶端發起了需要申請更多記憶體的指令(如set)。

2. Redis檢查記憶體使用情況,如果已使用的記憶體大于maxmemory則開始根據使用者配置的不同淘汰政策來淘汰記憶體(key),進而換取一定的記憶體。

3. 如果上面都沒問題,則這個指令執行成功。

maxmemory為0的時候表示我們對Redis的記憶體使用沒有限制。

3. 清理政策

在淘汰算法中,根據使用者設定的淘汰政策,選出待淘汰的key,直到目前記憶體小于最大記憶體值為主.

可選淘汰政策如下:

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(驅逐):禁止淘汰資料

4.使用場景

1)不要放垃圾資料,及時清理無用資料

        實驗性的資料和下線的業務資料及時删除;

2)key盡量都設定過期時間

        對具有時效性的key設定過期時間,通過redis自身的過期key清理政策來降低過期key對于記憶體的占用,同時也能夠減少業務的麻煩,不需要定期手動清理了.

3)單Key不要過大

        過大的key在get的時候網絡傳輸延遲會比較大,需要配置設定的輸出緩沖區也比較大,在定期清理的時候也容易造成比較高的延遲. 最好能通過業務拆分,資料壓縮等方式避免這種過大的key的産生。

4)不同業務如果公用一個業務的話,最好使用不同的邏輯db分開

allkeys-lru:如果我們的應用對緩存的通路符合幂律分布(也就是存在相對熱點資料),或者我們不太清楚我們應用的緩存通路分布狀況,我們可以選擇allkeys-lru政策。

allkeys-random:如果我們的應用對于緩存key的通路機率相等,則可以使用這個政策。

volatile-ttl:這種政策使得我們可以向Redis提示哪些key更适合被eviction。

另外,volatile-lru政策和volatile-random政策适合我們将一個Redis執行個體既應用于緩存和又應用于持久化存儲的時候,然而我們也可以通過使用兩個Redis執行個體來達到相同的效果,我們使用的是volatile-lru

參考:https://yq.aliyun.com/articles/257459

https://www.cnblogs.com/changbosha/p/5849982.html

繼續閱讀