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的內存上限可以通過config set maxmemory進行動態修改, 即修改最大可用內存。 例如之前的示例, 當發現Redis-2沒有做好內存預估, 實際只用了不到2GB內存, 而Redis-1實例需要擴容到6GB內存纔夠用, 這時可以分別執行如下命令進行調整:
Redis-1>config set maxmemory 6GB
Redis-2>config set maxmemory 2GB
通過動態修改maxmemory, 可以實現在當前服務器下動態伸縮Redis內存的目的, 如圖所示。

這個例子過於理想化, 如果此時Redis-3和Redis-4實例也需要分別擴容到6GB, 這時超出系統物理內存限制就不能簡單的通過調整maxmemory來達到擴容的目的, 需要採用在線遷移數據或者通過複製切換服務器來達到擴容的目的。 “哨兵”和“集羣”。

 Redis默認無限使用服務器內存, 爲防止極端情況下導致系統內存耗盡, 建議所有的Redis進程都要配置maxmemory。在保證物理內存可用的情況下, 系統中所有Redis實例可以調整maxmemory參數來達到自由伸縮內存的目的。

注意,在64bit系統下,maxmemory設置爲0表示不限制Redis內存使用,在32bit系統下,maxmemory不能超過3GB;

應用:
如mysql裏有2000w條數據,redis只存20w條熱點數據,如何保證redis中的數據都是熱點數據?
這就能設置最大內存,再設置淘汰策略,設置volatile-lru,allkeys-lru等都可以;



 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章