天天看點

Redis的删除政策----詳解

Redis的删除政策

Redis是在記憶體中存儲資料的,所有的資料都放在記憶體中。

記憶體中的資料狀态可以通過TTL進行擷取狀态

-1 永久性存儲的資料

-2 已經過期的資料/被删除的資料/未定義的資料

XX 具有時效性資料

過期的資料真的被删除了嗎?

Redis的删除政策----詳解

現實生活中的一個例子:

你女朋友叫你去吧垃圾扔掉

Redis的删除政策----詳解

但是,在打遊戲的你真的會去幹嗎???

過了一會,女朋友過來看見垃圾還在,這就是

Redis的删除政策----詳解

回到正題,當redis處理東西,發出一條指令到cpu(cpu無一點壓力)

Redis的删除政策----詳解

但是,如果一下子來了好多的指令呢?

Redis的删除政策----詳解

這時候,删除過期資料就不重要了,重要的是get和set指令

Redis的删除政策----詳解

過期資料:曾經設定過有效期的資料

Redis有三中過期資料删除政策:

定時删除

惰性删除

定期删除

時效性資料的存儲方式

設定時效資料:setex name 60 itcast;

setex age 10 66;

Redis的删除政策----詳解

當時效資料存儲之後,他會在redis的記憶體空間中開辟一個expires的空間,然後會将value的位址值作為key,有效時間為value存入

删除的政策隻是為了在記憶體和cpu之間尋找一個平衡

1.定時删除

建立一個定時器,當key設定有過期時間,并且到達過期時間,由定時器任務立即執行對建的删除操作

時間未到

Redis的删除政策----詳解

當到達過期時間,會将對應位址的資料(key)删除,同時expires中的資料也不留

Redis的删除政策----詳解

優點:節約記憶體,到點就會删除,快速釋放掉不必要的記憶體

缺點:無論cpu壓力有多大,都會去執行删除,占用cpu,影響redis性能

2.惰性删除

資料到達過期時間,不會進行删除,但是當下一次通路的時候會告知資料已經被删除,然後删除資料。

時間到了,但是不會删除資料

Redis的删除政策----詳解

查詢該資料的時候,會對其删除

伺服器對你撒了個謊,并偷偷删除了你的資料

會調用内部的:** expireIfneeded()** 檢查資料是否過期

每次get資料之前都會去執行expireIfNeeded() 方法

優點: 不會占用cpu性能,發現必須删除的時候才會進行删除

缺點:假如資料過期後,一直不被get,長時間占用記憶體

3.定期删除

Redis啟動伺服器初始化時,讀取配置server.hz的值,預設為10

info檢視:

Redis的删除政策----詳解

含義是每秒執行server.hz次的serverCorn()(輪詢)

serverCore() 裡面是對每一個庫進行輪詢 databasesCore()

在databasesCore() 的時候執行 activeExpireCycle()(檢查expires[i]中的) 時間為250ms/server.hz

在檢測的時候随機挑選w個key做檢測

如果key逾時,删除

1.假如删除的key的數量>w25%,繼續循環挑選key

2.假如删除的key的數量<w25%,檢查下一個expires[i]

W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP屬性值

serverCore()—>databasesCore()—> activeExpireCycle()

假如 activeExpireCycle()執行的時候時間到了,他會有一個參數current_db記錄現在輪詢到那一個expires中

redis中的删除政策,控制的是具有時效性的資料

—————————————————————————————————————————————

4. 逐出算法(長期key)

當redis伺服器set資料的時候,記憶體不足怎麼辦?
Redis的删除政策----詳解

當redis存儲資料的時候的都會對所需要的的記憶體進行判斷(freeMemoryIfNeeded()),檢測是否滿足存儲的最低要求,如果不夠,那就需要淘汰掉一些資料,這就是淘汰算法

  • 逐出資料的過程不是100%能夠清理出足夠的可使用的記憶體空間,如果不成功則反複執行。當對所

    有資料嘗試完畢後,如果不能達到記憶體清理的要求,将出現錯誤資訊。

  • Redis的删除政策----詳解

配置資訊

  • 最大可用記憶體
maxmemory

預設為0,表示不限制,通常設定為50%以上

  • 每次選取待删除個數
maxmemory-samples

删除并不會全庫進行掃描,會導緻性能消耗,采用随機擷取資料

  • 删除政策
  • 檢測易失資料(可能會過期的資料集server.db[i].expires )

    1 volatile-lru:挑選最近最少使用的資料淘汰

    2 volatile-lfu:挑選最近使用次數最少的資料淘汰

    3 volatile-ttl:挑選将要過期的資料淘汰

    4 volatile-random:任意選擇資料淘汰

  • 檢測全庫資料(所有資料集server.db[i].dict )

    5 allkeys-lru:挑選最近最少使用的資料淘汰

    6 allkeys-lfu:挑選最近使用次數最少的資料淘汰

    7 allkeys-random:任意選擇資料淘汰

  • 放棄資料驅逐

    8 no-enviction(驅逐):禁止驅逐資料(redis4.0中預設政策),會引發錯誤OOM(Out Of Memory)

繼續閱讀