Redis從入門到深入 刪除策略 18

2022-05-16 08:23:55 字數 2900 閱讀 3962

1. 刪除策略

1.1 過期資料

redis中的資料特徵

過期的資料真的刪除了嗎?

1.2 資料刪除策略

1.定時刪除

2.惰性刪除

3.定期刪除

1.3 時效性資料的儲存結構

1.4 資料刪除策略的目標

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

2. 定時刪除

優點:節約記憶體,到時就刪除,快速釋放掉不必要的記憶體占用

缺點:cpu壓力很大, 無論cpu此時負載量多高, 均占用cpu, 會影響redis伺服器響應時間和指令吞吐量

總結:用處理器效能換取儲存空間

3. 惰性刪除

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

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

4. 定期刪除-兩種方案都走極端,有沒有折中方案?

4.0 定期刪除策略

redis 會將每個設定了過期時間的 key 放入到乙個獨立的字典中,預設每 100ms 進行一次過期掃瞄:

隨機抽取 20 個 key

刪除這 20 個key中過期的key

如果過期的 key 比例超過 1/4,就重複步驟 1,繼續刪除。

4.0 定期刪除偽**

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

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

4.1 定期刪除特點

4.2 為什麼不掃瞄所有的key

redis 是單執行緒,全部掃瞄豈不是卡死了。而且為了防止每次掃瞄過期的 key 比例都超過 1/4,導致不停迴圈卡死執行緒,redis 為每次掃瞄新增了上限時間,預設是 25ms。

如果客戶端將超時時間設定的比較短,比如 10ms,那麼就會出現大量的鏈結因為超時而關閉,業務端就會出現很多異常。而且這時你還無法從 redis 的 slowlog 中看到慢查詢記錄,因為慢查詢指的是邏輯處理過程慢,不包含等待時間。

如果在同一時間出現大面積 key 過期,redis 迴圈多次掃瞄過期詞典,直到過期的 key 比例小於 1/4。這會導致卡頓,而且在高併發的情況下,可能會導致快取雪崩。

為什麼 redis 為每次掃瞄添的上限時間是 25ms,還會出現上面的情況?

因為 redis 是單執行緒,每個請求處理都需要排隊,而且由於 redis 每次掃瞄都是 25ms,也就是每個請求最多 25ms,100 個請求就是 2500ms。

5. 刪除策略比對

1.定時刪除 (節約記憶體,無占用)(不分時段占用cpu資源, 頻度高)(拿時間換空間)

2.惰性刪除(記憶體占用嚴重)(延時執行, cpu利用率高)(拿空間換時間)

3.定期刪除(記憶體定期隨機清理)(每秒花費固定的cpu資源維護記憶體)(隨機抽查,重點抽查)

傳智播客旗下高階it教育品牌

6. 逐出演算法

6.1 當新資料進入redis時, 如果記憶體不足怎麼辦?

6.2 影響資料逐出的相關配置

maxmemory
占用物理記憶體的比例,預設值為0,表示不限制。生產環境中根據需求設定,通常設定在50%以上。

maxmemory-samples
選取資料時並不會全庫掃瞄,導致嚴重的效能消耗,降低讀寫效能。因此採用隨機獲取資料的方式作為待檢測刪除資料

maxmemory-policy
達到最大記憶體後的,對被挑選出來的資料進行刪除的策略

6.3 影響資料逐出的相關配置

6.4 影響資料逐出的相關配置

max memory-policy volatile-lru
6.5 資料逐出策略配置依據

6.6 lru演算法

實現 lru 演算法除了需要 key/value 字典外,還需要附加乙個鍊錶,鍊錶中的元素按照一定的順序進行排列。當空間滿的時候,會踢掉鍊錶尾部的元素。當字典的某個元素被訪問時,它在鍊錶中的位置會被移動到表頭。所以鍊錶的元素排列順序就是元素最近被訪問的時間順序。

使用 python 的 ordereddict(雙向鍊錶 + 字典) 來實現乙個簡單的 lru 演算法:

6.7 lfu演算法

redis 4.0 裡引入了乙個新的淘汰策略 —— lfu(least frequently used) 模式,作者認為它比 lru 更加優秀。

lfu 表示按最近的訪問頻率進行淘汰,它比 lru 更加精準地表示了乙個 key 被訪問的熱度。

如果乙個 key 長時間不被訪問,只是剛剛偶然被使用者訪問了一下,那麼在使用 lru 演算法下它是不容易被淘汰的,因為 lru 演算法認為當前這個 key 是很熱的。而 lfu 是需要追蹤最近一段時間的訪問頻率,如果某個 key 只是偶然被訪問一次是不足以變得很熱的,它需要在近期一段時間內被訪問很多次才有機會被認為很熱。

redis 物件的熱度

redis 的所有物件結構頭中都有乙個 24bit 的字段,這個字段用來記錄物件的熱度。

Redis從入門到深入 鎖 17

1.鎖 1.1 基於特定條件的事務執行 業務場景 天貓雙11熱賣過程中,對已經售罄的貨物追加 4個業務員都有許可權進行 的操作可能是一系列的操作,牽扯到多個連續操作,如何保障不會重複操作?業務分析 解決方案 watch key1 key2.unwatch1.2 基於特定條件的事務執行2 業務場景 天...

Redis從入門到深入 Hash的value

2.hash型別 2.1 儲存的困惑 物件類資料的儲存如果具有較頻繁的更新需求操作會顯得笨重 2.2 hash型別 2.3 hash型別資料的基本操作 hsethget hgetallhdel field2 hmset hmget hlenhexistshkeys hvalshincrby hinc...

Redis從入門到入門

2安裝1.1支援的儲存結構 remote dictionary server 以字典儲存資料,允許其他應用通過tcp協議訪問字典內容。支援的鍵值型別 優點 redis的字典儲存方式和多重鍵值儲存方式,使得程式設計師可以直接將程式中的資料對映到redis中,資料在redis中的儲存方式和其在程式中的儲...