Redis內存監控及管理

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的壓力,可根據具體應用酌情應用)

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享