天天看點

Redis 記憶體管理 maxmemory設定記憶體上線

Redis主要通過控制記憶體上限和回收政策實作記憶體管理

設定記憶體上限

Redis使用maxmemory參數限制最大可用記憶體。 限制記憶體的目的主要有:

·用于緩存場景, 當超出記憶體上限maxmemory時使用LRU等删除政策釋放空間。

·防止所用記憶體超過伺服器實體記憶體。需要注意, maxmemory限制的是Redis實際使用的記憶體量, 也就是used_memory統計項對應的記憶體。 由于記憶體碎片率的存在, 實際消耗的記憶體可能會比maxmemory設定的更大, 實際使用時要小心這部分記憶體溢出。 通過

設定記憶體上限可以非常友善地實作一台伺服器部署多個Redis程序的記憶體控制。 比如一台24GB記憶體的伺服器, 為系統預留4GB記憶體, 預留4GB空閑記憶體給其他程序或Redis fork程序, 留給Redis16GB記憶體, 這樣可以部署4個maxmemory=4GB的Redis程序。 得益于Redis單線程架構和記憶體限制機制, 即使沒有采用虛拟化, 不同的Redis程序之間也可以很好地實作CPU和記憶體的

隔離性, 如圖所示。

Redis 記憶體管理 maxmemory設定記憶體上線

動态調整記憶體上限

Redis的記憶體上限可以通過config set maxmemory進行動态修改, 即修改最大可用記憶體。 例如之前的示例, 當發現Redis-2沒有做好記憶體預估, 實際隻用了不到2GB記憶體, 而Redis-1執行個體需要擴容到6GB記憶體才夠用, 這時可以分别執行如下指令進行調整:

Redis-1>config set maxmemory 6GB

Redis-2>config set maxmemory 2GB

通過動态修改maxmemory, 可以實作在目前伺服器下動态伸縮Redis記憶體的目的, 如圖所示。

Redis 記憶體管理 maxmemory設定記憶體上線

這個例子過于理想化, 如果此時Redis-3和Redis-4執行個體也需要分别擴容到6GB, 這時超出系統實體記憶體限制就不能簡單的通過調整maxmemory來達到擴容的目的, 需要采用線上遷移資料或者通過複制切換伺服器來達到擴容的目的。 “哨兵”和“叢集”。

 Redis預設無限使用伺服器記憶體, 為防止極端情況下導緻系統記憶體耗盡, 建議所有的Redis程序都要配置maxmemory。在保證實體記憶體可用的情況下, 系統中所有Redis執行個體可以調整maxmemory參數來達到自由伸縮記憶體的目的。

注意,在64bit系統下,maxmemory設定為0表示不限制Redis記憶體使用,在32bit系統下,maxmemory不能超過3GB;