redis所有數據都是存放在內存中的,所以內存的監控及管理對redis來是是非常重要的。下面從內存監控、管理及優化三個方面來說說redis的內存。
內存監控
redis為我們提供了info memory命令來查看內存使用。該命令的展示的數據非常多,下面只看其中比較重要的一些。
-
used_memory:1146648 (redis分配器分配的內存量)
-
used_memory_human:1.09M(以可讀方式展示)
-
used_memory_rss:4358144 (redis總占用內存量)
-
used_memory_rss_human:4.16M(可讀方式展示redis總占用內存量)
-
used_memory_peak:1229448 (userd_memory_peak峰值)
-
used_memory_peak_human:1.17M
-
used_memory_overhead:857036(緩沖區、backlog等占用的內存)
-
used_memory_startup:791384(啟動redis消耗的內存)
-
used_memory_dataset:289612(redis數據所占用的內存)
-
used_memory_lua:37888(lua腳本消耗的內存)
-
used_memory_lua_human:37.00K(可讀方式展現)
-
mem_fragmentation_ratio:4.02(內存碎片率,used_memory_rss / used_memory)
mem_fragmentation_ratio大于1時,表示有內存碎片,數值越低表示碎片率越嚴重。應用允許的情況下,可以重啟redis來降低碎片率。當小于0時,就要非常注意了,表示內存不夠用了,使用了部分swap。
內存管理
一般建議給redis設置內存上限,maxmory
修改方式有兩種
-
修改配置文件
-
動態設置
下面展示動態設置
127.0.0.1:6379>?config?set?maxmemory?1G OK 127.0.0.1:6379>?config?rewrite OK
設置最大內存有兩個方面的作用,首先可以限制redis占用的內存大小,防止超過物理內存大小。另外,當設置了最大內存后,redis超過了最大內存后,就可以觸發內存回收策略(通常應用于緩存場景)
redis可以動態調整最大內存是非常好用的,當服務器內存不夠用的情況下,需要增加內存,當服務器內存增大了,再動態調整redis的mammemory。
另外,redis的內存回收策略的配置(maxmemory-policy)有幾個,其中有兩個單詞經常出現,LRU、LFU,意義分別如下:
-
最近最少使用的(Least Recently Used)
-
最近最不常用的(Least Frequently Used)
下面來看看所有的回收策略及意義:
-
noeviction:默認策略,不會刪除任何鍵,當超過最大內存后,拒絕任何寫入命令,只響應讀命令
-
volatile-lru:根據lru算法刪除過期的鍵,如果沒有可刪除的鍵,則回退到noeviction策略。
-
allkeys-lru:根據lru算法刪除鍵,不管鍵是否過期,直到占用內存小于maxmeory為止。
-
allkeys-lfu:和上面含義一致,只不過是使用lfu算法來刪除。
-
allkeys-random:當達到最大內存后,隨機刪除鍵。
-
volatile-ttl:刪除快要過期的鍵。如果沒有則回退到noeviction。
內存優化
上面說了redis回收策略,它屬于被動刪除策略,我們可以主動去刪除長時間沒有訪問的鍵??梢酝ㄟ^使用scan遍歷鍵,然后使用object ideltime來查看鍵的空閑時間,刪除那些長時間沒有訪問的鍵。
此外,還可以縮減鍵值對象的方式來減低內存的占用量。
127.0.0.1:6379>?scan?0 1)?"272" 2)??1)?"story:course:3915" ????2)?"story:course:1681" ????3)?"story:course:4982" ……
比如,上面的鍵可以改為:sy:cos:id來減低鍵的長度。對于,值的話,可以使用壓縮技術來降低值的長度。(壓縮會增加cpu的壓力,可根據具體應用酌情應用)