Redis内存相关

176 阅读2分钟

Redis内存模型

Redis内存占用主要分为以下几部分:

  1. 数据。
  2. 进程运行占用的内存。Redis主进程占用的内存统计在used_memory_rss中,fork的子进程不统计在内。
  3. 缓冲内存,包括:
  • 客户端缓冲区:存储客户端连接的输入输出缓冲
  • 复制积压缓冲:用于主从复制
  • AOF缓冲区:用于在AOF重写时,保存最近的写入命令
  1. 内存碎片。解决内存碎片的方式是重启。

Redis内存统计

使用info memory命令可以查看redis内存使用情况。

127.0.0.1:6379> info memory
# Memory
used_memory:708288
used_memory_human:691.69K
used_memory_rss:671360
used_memory_rss_human:655.63K
used_memory_peak:709144
used_memory_peak_human:692.52K
total_system_memory:0
total_system_memory_human:0B
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:0.95
mem_allocator:jemalloc-3.6.0
  1. used_memory:redis内存分配器分配的内存总量,包括使用的虚拟内存。
  2. used_memory_rss:redis进程占据操作系统的内存,与top及ps命令看到的值是一致的;除了分配器分配的内存之外,used_memory_rss还包括进程运行本身需要的内存、内存碎片等,但是不包括虚拟内存。
  3. used_memory_peak:redis的内存消耗峰值。
  4. used_memory_lua:Lua引擎所使用的内存大小。
  5. mem_fragmentation_radio:used_memory_rss和used_momory比率。
  6. mem_allocator:redis使用的内存分配器,默认jemalloc。

在理想情况下,used_memory_rss的值应该只比used_memory稍微高一点。 当rss > used,且两者相差较大时,表示存在内部或外部的内存碎片,碎片比率可以通过mem_fragmentation_radio的值看出。 当used > rss,表示redis的部分内存被操作系统换出到交换空间了,在这种情况下,操作可能会产生明显的延迟。

Redis monitor命令

monitor命令用于实时打印出redis服务器收到的命令,调试用。

它会将所有在redis服务器执行的命令发送给每个监视器。高并发情况下,容易造成monitor这个客户端的输出缓冲区内存占用增高。