1. 程式人生 > >Redis資料淘汰機制

Redis資料淘汰機制

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

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

通過如下配置控制Redis使用的最大記憶體:maxmemory 100mb

在記憶體佔用達到了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指定一種有效的資料淘汰策略以配合maxmemory設定,避免在記憶體使用滿後發生寫入失敗的情況。

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

配置方法:

maxmemory-policy volatile-lru #預設是noeviction,即不進行資料淘汰