可以採用三種方法:
定時刪除、定期刪除、惰性刪除
一、定時刪除
寫乙個定時器,將key的過期時間到達時,立刻將鍵刪除
優點:節約記憶體
缺點:增加cpu壓力,影響redis伺服器響應時間和吞吐量
二、定期刪除
activeexpirecycle()函式對每個expires(資料庫)逐一進行檢測
對每個資料庫檢測時,隨機挑選w個key檢測
1.如果key超時,刪除key
2.如果一輪中刪除key的數量》w*25%,迴圈該過程(繼續挑選w個key檢測)
3.如果一輪中刪除key的數量<=w*25%,檢查下乙個資料庫,一直這樣迴圈
4.w取值=active_expire_cycle_lookups_per_loop屬性值
引數current_db用於記錄activeexpirecyle()進入哪個資料庫執行,如果activeexpirecycle()執行時間到期,下次從current_db繼續向下執行
特點:隨機抽查、重點抽查
優點;檢測頻度可以自定義,記憶體占用不是很大
缺點:清理不徹底
三、惰性刪除
資料過期之後不處理,等下次查詢的時候在刪除
優點:cpu占用不大
缺點:記憶體占用很大,過期資料一直存在
四、資料逐出策略
執行所有命令的時候,都會檢測記憶體是否充足
不滿足最低儲存要求的時候,就會清理資料,清理資料的演算法叫逐出演算法
如果逐出演算法不能清理出足夠的空間就會反覆執行。當依然無法清理出空間的時候就會報錯:
(error)oom command not allowed when used memory>'maxmemory'
設定最大可使用記憶體maxmemory #占用物理記憶體的比例,預設值為0,表示不限制。生產環境中根據需求設定,通常設定在50%以上。
每次隨機選取待刪除資料的個數
maxmemory-samples #選取資料時並不會全庫掃瞄,導致嚴重的效能消耗,降低讀寫效能。因此採用隨機獲取資料的方式作為待檢測刪除資料
選擇刪除策略
maxmemory-policy #達到最大記憶體後,對被挑選出來的資料進行刪除的方式
刪除方式:
檢測易失資料(可能會過期的資料集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
maxmemory-policy volatile-lru
Redis 過期資料怎麼處理
在 redis 中,是可以設定過期資料的,redis 提供了兩種的方式,用於刪除過期的資料!redis 預設 100ms 隨即抽取部分設定過期時間的 key,過期了就刪除。優點是避免長時間的在掃瞄過期 key,缺點是有些過期 key 無法被刪除。不掃瞄全部 key 的原因是,當設定了過期時間的 ke...
Redis過期資料和刪除策略
因為記憶體有限,有些資料不需要一直在記憶體中,可以設定一些規則,將一些資料設定過期,在記憶體中刪除,當然也不是隨便刪除,也要考慮到cpu的繁忙與空閒,以免出現redis各種命令執行很多,但是正好出現大量過期資料,已造成伺服器宕機 是在記憶體占用與cpu占用之間尋找一種平衡,顧此失彼都會造成redis...
mongodb刪除過期資料
通常,你往某乙個mongo庫中插資料,然後按日輪詢,最終這個資料會越來越多,對於不用的資料需要進行清理。這篇文章主要將如何清理過期資料。舉個例子 你只需要最近2個月的資料,比如今天是20170829,那麼60天之前的資料都可以清理掉。你可以寫乙個crontab任務,然後匯入指令碼,每天執行一次,將6...