Redis的删除政策
Redis是在記憶體中存儲資料的,所有的資料都放在記憶體中。
記憶體中的資料狀态可以通過TTL進行擷取狀态
-1 永久性存儲的資料
-2 已經過期的資料/被删除的資料/未定義的資料
XX 具有時效性資料
過期的資料真的被删除了嗎?
現實生活中的一個例子:
你女朋友叫你去吧垃圾扔掉
但是,在打遊戲的你真的會去幹嗎???
過了一會,女朋友過來看見垃圾還在,這就是
回到正題,當redis處理東西,發出一條指令到cpu(cpu無一點壓力)
但是,如果一下子來了好多的指令呢?
這時候,删除過期資料就不重要了,重要的是get和set指令
過期資料:曾經設定過有效期的資料
Redis有三中過期資料删除政策:
定時删除
惰性删除
定期删除
時效性資料的存儲方式
設定時效資料:setex name 60 itcast;
setex age 10 66;
當時效資料存儲之後,他會在redis的記憶體空間中開辟一個expires的空間,然後會将value的位址值作為key,有效時間為value存入
删除的政策隻是為了在記憶體和cpu之間尋找一個平衡
1.定時删除
建立一個定時器,當key設定有過期時間,并且到達過期時間,由定時器任務立即執行對建的删除操作
時間未到
當到達過期時間,會将對應位址的資料(key)删除,同時expires中的資料也不留
優點:節約記憶體,到點就會删除,快速釋放掉不必要的記憶體
缺點:無論cpu壓力有多大,都會去執行删除,占用cpu,影響redis性能
2.惰性删除
資料到達過期時間,不會進行删除,但是當下一次通路的時候會告知資料已經被删除,然後删除資料。
時間到了,但是不會删除資料
查詢該資料的時候,會對其删除
伺服器對你撒了個謊,并偷偷删除了你的資料
會調用内部的:** expireIfneeded()** 檢查資料是否過期
每次get資料之前都會去執行expireIfNeeded() 方法
優點: 不會占用cpu性能,發現必須删除的時候才會進行删除
缺點:假如資料過期後,一直不被get,長時間占用記憶體
3.定期删除
Redis啟動伺服器初始化時,讀取配置server.hz的值,預設為10
info檢視:
含義是每秒執行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存儲資料的時候的都會對所需要的的記憶體進行判斷(freeMemoryIfNeeded()),檢測是否滿足存儲的最低要求,如果不夠,那就需要淘汰掉一些資料,這就是淘汰算法
-
逐出資料的過程不是100%能夠清理出足夠的可使用的記憶體空間,如果不成功則反複執行。當對所
有資料嘗試完畢後,如果不能達到記憶體清理的要求,将出現錯誤資訊。
配置資訊
- 最大可用記憶體
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)