1、内存统计
查看内存:
127.0.0.1:6379> info memory
# Memory
used_memory:689408
used_memory_human:673.25K
used_memory_rss:652472
used_memory_rss_human:637.18K
used_memory_peak:766384
used_memory_peak_human:748.42K
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
used_memory:redis分配器分配的内存总量(单位是字节),包括虚拟内存(swap,使用硬盘代替内存)
used_memory_rss:redis进程占据操作系统的内存。除了分配器分配的内存,还包括了进程运行本身需要的内存、内存碎片等,但不包含虚拟内存。
used_memory_peak:内存使用的最大值。use_memory
used_memory_lua:lua引起消耗的内存大小
mem_fragmentation_ratio:内存碎片率(used_memory_rss/used_memory)。如果该值大于1,说明有部分内存并没有用于数据存储,而是被内存碎片所消耗,值越大,内存碎片就越严重。如果值小于1,这种情况一般是操作系统把redis内存交换(swap)到硬盘所致,由于硬盘性能远远低于内存,会导致redis的性能变得很差。
mem_allocator:redis使用的内存分配器,在编译时指定,可以值有libc 、jemalloc或者tcmalloc,默认是jemalloc
对象内存:存储用户的所有数据。Redis 所有的数据都采用 key-value 数据类型,每次创建键值对时,至少创建两个类型对象:key 对象和 value 对象
缓冲内存:客户端缓冲、复制积压缓冲、AOF重写缓冲
客户端缓冲:分为输入和输出缓冲区。
输入缓冲区:无法控制,最大空间为1G,超过断开连接。
输出缓冲区:可以通过client-output-buffer-limit设置。
复制积压缓冲区:用于实现主从的部分复制功能。可以通过repl-backlog-size设置,默认1M。
AOF重写缓冲区:用于保存AOF重写期间的写命令
内存碎片:内存碎片是Redis在分配、回收物理内存过程中产生的。例如,如果对数据的更改频繁,而且数据之间的大小相差很大,可能导致redis释放的空间在物理内存中并没有释放,但redis又无法有效利用,这就形成了内存碎片。内存碎片不会统计在used_memory中。
如果Redis服务器中的内存碎片已经很大,可以通过安全重启的方式减小内存碎片:因为重启之后,Redis重新从备份文件中读取数据,在内存中进行重排,为每个数据重新选择合适的内存单元,减小内存碎片。