Redis的刪除策略

2022-04-02 04:11:40 字數 2514 閱讀 4779

資料刪除策略的目標

在記憶體占用與cpu占用之間尋找一種平衡,顧此失彼都會造成整體redis效能的下降,甚至引發伺服器宕機或記憶體洩露 。

定時刪除

redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是

採用了一種簡單的貪心策略。

1、從過期字典中隨機 20 個 key;

2、刪除這 20 個 key 中已經過期的 key;

3、如果過期的 key 比率超過 1/4,那就重複步驟 1;

同時,為了保證過期掃瞄不會出現迴圈過度,導致執行緒卡死現象,演算法還增加了掃瞄時間的上限,預設不會超過 25ms。

設想乙個大型的 redis 例項中所有的 key 在同一時間過期了,會出現怎樣的結果?

毫無疑問,redis 會持續掃瞄過期字典 (迴圈多次),直到過期字典中過期的 key 變得稀

疏,才會停止 (迴圈次數明顯下降)。這就會導致線上讀寫請求出現明顯的卡頓現象。導致這

種卡頓的另外一種原因是記憶體管理器需要頻繁**記憶體頁,這也會產生一定的 cpu 消耗。

也許你會爭辯說「掃瞄不是有 25ms 的時間上限了麼,怎麼會導致卡頓呢」?這裡打個

比方,假如有 101 個客戶端同時將請求發過來了,然後前 100 個請求的執行時間都是

25ms,那麼第 101 個指令需要等待多久才能執行?2500ms,這個就是客戶端的卡頓時間,

是由伺服器不間斷的小卡頓積少成多導致的。

所以業務開發人員一定要注意過期時間,如果有大批量的 key 過期,要給過期時間設定

乙個隨機範圍,而不能全部在同一時間過期。

# 在目標過期時間上增加一天的隨機時間

redis.expire_at(key, random.randint(86400) + expire_ts)

在一些活動系統中,因為活動是一期一會,下一期活動舉辦時,前面幾期的很多資料都

可以丟棄了,所以需要給相關的活動資料設定乙個過期時間,以減少不必要的 redis 記憶體佔

用。如果不加注意,你可能會將過期時間設定為活動結束時間再增加乙個常量的冗餘時間,

如果參與活動的人數太多,就會導致大量的 key 同時過期。

掌閱服務端在開發過程中就曾出現過多次因為大量 key 同時過期導致的卡頓報警現象,

通過將過期時間隨機化總是能很好地解決了這個問題。

惰性刪除

資料到達過期時間,不做處理。等下次訪問該資料時

如果未過期,返回資料

發現已過期,刪除,返回不存在

優點:節約cpu效能,發現必須刪除的時候才刪除

缺點:記憶體壓力很大,出現長期占用記憶體的資料

總結:用儲存空間換取處理器效能(拿空間換時間)

定期刪除

週期性輪詢redis庫中的時效性資料,採用隨機抽取的策略,利用過期資料佔比的方式控制刪除頻度

特點1: cpu效能占用設定有峰值,檢測頻度可自定義設定

特點2:記憶體壓力不是很大,長期占用記憶體的冷資料會被持續清理

總結:週期性抽查儲存空間(隨機抽查,重點抽查) 

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

每秒鐘執行server.hz次servercron()

activeexpirecycle()對每個expires[*]逐一進行檢測,每次執行250ms/server.hz

對某個expires[*]檢測時,隨機挑選w個key檢測

如果key超時,刪除key

如果一輪中刪除的key的數量》w*25%,迴圈該過程

如果一輪中刪除的key的數量≤w*25%,檢查下乙個expires[*], 0-15迴圈

w取值=active_expire_cycle_lookups_per_loop屬性值

引數current_db用於記錄activeexpirecycle() 進入哪個expires[*] 執行

如果activeexpirecycle()執行時間到期,下次從current_db繼續向下執行

等看書老錢的redis深度歷險,在回來補充一下。

Redis的刪除策略

redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 優點 節約記憶體,到時就刪除,快速釋放掉不必要的記憶體占用 缺點 cpu壓力很大,無論cpu此時負載量多高,均占用cpu,會影響redis伺服器響應時間和指令吞吐量 總結 用處理器效能換取儲存空間 ...

Redis刪除策略

目錄 1.過期資料 2.資料刪除策略 2.1 定時刪除 2.2 惰性刪除 2.3 定期刪除 2.4 三種資料刪除策略對比 3.逐出演算法 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 對於過期資料,redis內部是否真正釋放了其記憶體空間?目標...

Redis 刪除策略

redis中的資料特徵 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 資料刪除策略 定時刪除 惰性刪除 定期刪除 資料刪除策略 資料刪除策略的目標 在記憶體占用與cpu占用之間尋找一種平衡,顧此失彼都會造成整體redis效能的下降,甚至引發伺服...