Redis 資料淘汰機制

2022-08-09 19:15:18 字數 2648 閱讀 5735

為了更好的利用記憶體,使redis儲存的都是快取的熱點資料,redis設計了相應的記憶體淘汰機制(也叫做快取淘汰機制)

通過maxmemory 配置項來設定允許使用者使用的最大記憶體大小,當記憶體資料集大小達到一定的大小時,就會根據maxmemory-policy noeviction配置項配置的策略來進行資料淘汰。

預設為no-eviction策略

從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰

從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰

從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰

從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰

從資料集(server.db[i].dict)中任意選擇資料淘汰

禁止驅逐資料,永遠不過期,僅對寫操作返回乙個錯誤,預設為該項

redis 確定驅逐某個鍵值對後,會刪除這個資料,並將這個資料變更訊息發布到本地(aof 持久化)和從機(主從連線)

實際上redis實現的lru並不是可靠的lru,也就是名義上我們使用lru演算法淘汰鍵,但是實際上被淘汰的鍵並不一定是真正的最久沒用的,這裡涉及到乙個權衡的問題,如果需要在全部鍵空間內搜尋最優解,則必然會增加系統的開銷,redis是單執行緒的,也就是同乙個例項在每乙個時刻只能服務於乙個客戶端,所以耗時的操作一定要謹慎。為了在一定成本內實現相對的lru,早期的redis版本是基於取樣的lru,也就是放棄全部鍵空間內搜尋解改為取樣空間搜尋最優解。自從redis3.0版本之後,redis作者對於基於取樣的lru進行了一些優化,目的是在一定的成本內讓結果更靠近真實的lru。

redis 資料集資料結構中儲存了鍵值對過期時間的表,即 redisdb.expires,在使用 set 命令的時候,就有乙個鍵值對超時時間的選項。

從過期時間 redisdb.expires 表中隨機挑選幾個鍵值對,取出其中 ttl 最大的鍵值對淘汰。同樣ttl淘汰策略並不是所有過期時間的表中最快過期的鍵值對,而只是隨機挑選的幾個鍵值對。

在隨機淘汰的場景下獲取待刪除的鍵值對,隨機找hash桶再次hash指定位置的dictentry即可

redis中的淘汰機制(lru和ttl)都是非精確演算法實現的,主要從效能和可靠性上做平衡,所以並不是完全可靠,在了解redis淘汰策略之後還應在平時多主動設定或更新key的expire時間,主動刪除沒有價值的資料,提公升redis整體效能和空間

通過maxmemory 配置項來設定允許使用者使用的最大記憶體大小,當記憶體資料集大小達到一定的大小時,就會根據maxmemory-policy noeviction配置項配置的策略來進行資料淘汰。

預設為no-eviction策略

從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰

從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰

從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰

從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰

從資料集(server.db[i].dict)中任意選擇資料淘汰

禁止驅逐資料,永遠不過期,僅對寫操作返回乙個錯誤,預設為該項

redis 確定驅逐某個鍵值對後,會刪除這個資料,並將這個資料變更訊息發布到本地(aof 持久化)和從機(主從連線)

實際上redis實現的lru並不是可靠的lru,也就是名義上我們使用lru演算法淘汰鍵,但是實際上被淘汰的鍵並不一定是真正的最久沒用的,這裡涉及到乙個權衡的問題,如果需要在全部鍵空間內搜尋最優解,則必然會增加系統的開銷,redis是單執行緒的,也就是同乙個例項在每乙個時刻只能服務於乙個客戶端,所以耗時的操作一定要謹慎。為了在一定成本內實現相對的lru,早期的redis版本是基於取樣的lru,也就是放棄全部鍵空間內搜尋解改為取樣空間搜尋最優解。自從redis3.0版本之後,redis作者對於基於取樣的lru進行了一些優化,目的是在一定的成本內讓結果更靠近真實的lru。

redis 資料集資料結構中儲存了鍵值對過期時間的表,即 redisdb.expires,在使用 set 命令的時候,就有乙個鍵值對超時時間的選項。

從過期時間 redisdb.expires 表中隨機挑選幾個鍵值對,取出其中 ttl 最大的鍵值對淘汰。同樣ttl淘汰策略並不是所有過期時間的表中最快過期的鍵值對,而只是隨機挑選的幾個鍵值對。

在隨機淘汰的場景下獲取待刪除的鍵值對,隨機找hash桶再次hash指定位置的dictentry即可

redis中的淘汰機制(lru和ttl)都是非精確演算法實現的,主要從效能和可靠性上做平衡,所以並不是完全可靠,在了解redis淘汰策略之後還應在平時多主動設定或更新key的expire時間,主動刪除沒有價值的資料,提公升redis整體效能和空間

redis資料淘汰機制

在redis中,redis允許使用者更改設定最大記憶體maxmemory,在每次寫入或更新等操作時候,redis會檢查使用的記憶體,當記憶體達到最大值得時候,就會進行資料淘汰策略,從而換取記憶體出來 redis資料淘汰策略有6種 volatile lru 從已設定過期時間的資料集 server.db...

redis資料淘汰機制

redis資料淘汰機制 概述 在 redis 中,允許使用者設定最大使用記憶體大小 server.maxmemory,在記憶體限定的情況下是很有用的。譬如,在一台 8g 機子上部署了 4 個 redis 服務點,每乙個服務點分配 1g 的記憶體大小,減少記憶體緊張的情況,由此獲取更為穩健的服務。re...

Redis 資料淘汰機制

為了更好的利用記憶體,使redis儲存的都是快取的熱點資料,redis設計了相應的記憶體淘汰機制 也叫做快取淘汰機制 通過maxmemory 配置項來設定允許使用者使用的最大記憶體大小,當記憶體資料集大小達到一定的大小時,就會根據maxmemory policy noeviction配置項配置的策略...