Redis記憶體管理與資料淘汰機制

2021-10-06 10:44:56 字數 2079 閱讀 6624

資料淘汰機制

預設情況下,在32位os中,redis最大使用3gb的記憶體,在64位os中則沒有限制。

在使用redis時,應該對資料占用的最大空間有乙個基本準確的預估,並為redis設定最大使用的記憶體。否則在64位os中redis會無限制地占用記憶體(當物理記憶體被佔滿後會使用swap空間),容易引發各種各樣的問題。

通過如下配置控制redis使用的最大記憶體:

maxmemory 100mb
maxmemory 的用法
maxmemory 1048576

maxmemory 1048576b

maxmemory 1000kb

maxmemory 100mb

maxmemory 1gb

maxmemory 1000k

maxmemory 100m

maxmemory 1g

沒有帶單位尾巴的為位元組數,以b結尾的表示相應的大小。但需要注意kb和k、mb和m、gb和g是不同的,如1k表示1000位元組,而1kb則為1024位元組。如果maxmemory值為0,表示不做限制。

如果是32位系統,當maxmemory值為0時,redis啟動時會記錄warn日誌:

如果要檢視maxmemory的值,有如下兩種方法:

redis-cli -h 192.168.31.8 -p 6379 config get maxmemory

或redis-cli -h 192.168.31.8 -p 6379 info memory | grep maxmemory

在記憶體占用達到了maxmemory後,再向redis寫入資料時,redis會:

根據配置的資料淘汰策略嘗試淘汰資料,釋放空間

如果沒有資料可以淘汰,或者沒有配置資料淘汰策略,那麼redis會對所有寫請求返回錯誤,但讀請求仍然可以正常執行

在為redis設定maxmemory時,需要注意:

如果採用了redis的主從同步,主節點向從節點同步資料時,會占用掉一部分記憶體空間,如果maxmemory過於接近主機的可用記憶體,導致資料同步時記憶體不足。所以設定的maxmemory不要過於接近主機可用的記憶體,留出一部分預留用作主從同步。

redis提供了6種資料淘汰策略:

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

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

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

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

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

no-enviction(驅逐):禁止驅逐資料

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

如果設定了過期時間,在達到記憶體最大的時候,建議可以使用第一種volatile-lru淘汰策略

如果沒有設定過期時間,在達到記憶體最大時候,建議使用allkeys-lru淘汰策略

最好為redis指定一種有效的資料淘汰策略以配合maxmemory設定,避免在記憶體使用滿後發生寫入失敗的情況。

一般來說,推薦使用的策略是volatile-lru,並辨識redis中儲存的資料的重要性。對於那些重要的,絕對不能丟棄的資料(如配置類資料等),應不設定有效期,這樣redis就永遠不會淘汰這些資料。對於那些相對不是那麼重要的,並且能夠熱載入的資料(比如快取最近登入的使用者資訊,當在redis中找不到時,程式會去db中讀取),可以設定上有效期,這樣在記憶體不夠時redis就會淘汰這部分資料。

配置方法:

maxmemory-policy volatile-lru   #預設是noeviction,即不進行資料淘汰
在redis中,redis允許使用者更改設定最大記憶體maxmemory,在每次寫入或更新等操作時候,redis會檢查使用的記憶體,當記憶體達到最大值得時候,就會進行資料淘汰策略,從而換取記憶體出來

redis 記憶體管理與資料淘汰機制

預設情況下,在32位os中,redis最大使用3gb的記憶體,在64位os中則沒有限制。在使用redis時,應該對資料占用的最大空間有乙個基本準確的預估,並為redis設定最大使用的記憶體。否則在64位os中redis會無限制地占用記憶體 當物理記憶體被佔滿後會使用swap空間 容易引發各種各樣的問...

Redis的記憶體管理 記憶體淘汰

給redis設定一些位元組大小去限制記憶體使用,當redis達到所設定的記憶體大小,redis將會刪除一些key,根據所制定的記憶體淘汰策略。如果redis不能刪除key根據所給的策略,或者如果當前的淘汰策略是novication,有新的key進來的時候,redis將回出錯,比如set操作 lpus...

記憶體淘汰演算法 Redis資料淘汰演算法

眾所周知,redis的所有資料都儲存在記憶體中,但是記憶體是一種有限的資源,所以為了防止redis無限制的使用記憶體,在啟動redis時可以通過配置項maxmemory來指定其最大能使用的記憶體容量。例如可以通過以下配置來設定redis最大能使用 1g 記憶體 maxmemory 1g當redis使...