Redis實戰 記憶體淘汰機制

2021-09-07 19:22:26 字數 1642 閱讀 7795

文章目錄

1. 如何配置

2. 動態改配置命令

2.1. 設定最大記憶體

2.2. 設定淘汰策略

3. 記憶體淘汰策略

3.1. volatile-lru

3.2. volatile-ttl

3.3. volatile-random

3.4. allkeys-lru

3.5. allkeys-random

3.6. no-enviction

4. 如何選擇淘汰策略

redis 記憶體資料集大小上公升到一定大小的時候,就會進行資料淘汰策略。

我們通過配置redis.conf中的maxmemory這個值來開啟記憶體淘汰功能。

# maxmemory

值得注意的是,maxmemory為0的時候表示我們對redis的記憶體使用沒有限制。

根據應用場景,選擇淘汰策略

# maxmemory-policy noeviction

我們來了解下,記憶體淘汰的過程

首先,客戶端發起了需要申請更多記憶體的命令(如set)。

然後,redis檢查記憶體使用情況,如果已使用的記憶體大於maxmemory則開始根據使用者配置的不同淘汰策略來淘汰記憶體(key),從而換取一定的記憶體。

最後,如果上面都沒問題,則這個命令執行成功。

此外,redis支援動態改配置,無需重啟。

config set maxmemory 100000

config set maxmemory-policy noeviction

從已設定過期時間的資料集中挑選最近最少使用的資料淘汰。redis並不是保證取得所有資料集中最近最少使用的鍵值對,而只是隨機挑選的幾個鍵值對中的, 當記憶體達到限制的時候無法寫入非過期時間的資料集。

從已設定過期時間的資料集中挑選將要過期的資料淘汰。redis 並不是保證取得所有資料集中最近將要過期的鍵值對,而只是隨機挑選的幾個鍵值對中的, 當記憶體達到限制的時候無法寫入非過期時間的資料集。

從已設定過期時間的資料集中任意選擇資料淘汰。當記憶體達到限制的時候無法寫入非過期時間的資料集。

從資料集中挑選最近最少使用的資料淘汰。當記憶體達到限制的時候,對所有資料集挑選最近最少使用的資料淘汰,可寫入新的資料集。

從資料集中任意選擇資料淘汰,當記憶體達到限制的時候,對所有資料集挑選隨機淘汰,可寫入新的資料集。

當記憶體達到限制的時候,不淘汰任何資料,不可寫入任何資料集,所有引起申請記憶體的命令會報錯。

下面看看幾種策略的適用場景

allkeys-lru:如果我們的應用對快取的訪問符合冪律分布,也就是存在相對熱點資料,或者我們不太清楚我們應用的快取訪問分布狀況,我們可以選擇allkeys-lru策略。

allkeys-random:如果我們的應用對於快取key的訪問概率相等,則可以使用這個策略。

volatile-ttl:這種策略使得我們可以向redis提示哪些key更適合被eviction。

另外,volatile-lru策略和volatile-random策略適合我們將乙個redis例項既應用於快取和又應用於持久化儲存的時候,然而我們也可以通過使用兩個redis例項來達到相同的效果,值得一提的是將key設定過期時間實際上會消耗更多的記憶體,因此我們建議使用allkeys-lru策略從而更有效率的使用記憶體。

Redis實戰 記憶體淘汰機制

文章目錄 1.如何配置 2.動態改配置命令 2.1.設定最大記憶體 2.2.設定淘汰策略 3.記憶體淘汰策略 3.1.volatile lru 3.2.volatile ttl 3.3.volatile random 3.4.allkeys lru 3.5.allkeys random 3.6.no...

Redis 記憶體淘汰機制

摘要redis是一款優秀的 開源的記憶體資料庫,我在閱讀redis原始碼實現的過程中,時時刻刻能感受到redis作者為更好地使用記憶體而費盡各種心思,例如最明顯的是對於同一種資料結構在不同應用場景下提供了基於不同底層編碼的實現 如壓縮列表 跳躍表等 今天我們暫時放下對redis不同資料結構的 來一起...

redis 記憶體淘汰機制

redis記憶體淘汰指的是使用者儲存的一些鍵被可以被redis主動地從例項中刪除,從而產生讀miss的情況,那麼redis為什麼要有這種功能?這就是我們需要 的設計初衷。redis最常見的兩種應用場景為快取和持久儲存,首先要明確的乙個問題是記憶體淘汰策略更適合於那種場景?是持久儲存還是快取?記憶體的...