简介

redis是缓存数据库,比较依赖内存的使用情况。

可以通过INFO MEMORY,查看内存的使用情况

解析

执行命令之后可以看到下面的值,其中没有注明单位的都是是字节(byte)为单位,_human结尾的都是,转换成比较容易读取的单位:

# Memory
used_memory:720640    #分配的内存总量,以字节(byte)为单位
used_memory_human:703.75K
used_memory_rss:12599296  #从操作系统的角度,返回 Redis 已分配的内存总量。这个值和 top 、 ps 等命令的输出一致
used_memory_rss_human:12.02M  
used_memory_peak:444919184  #内存消耗峰值
used_memory_peak_human:424.31M
used_memory_peak_perc:0.16%  #内存达到峰值内存的百分比,计算方式为:(used_memory/ used_memory_peak) * 100%
used_memory_overhead:676040 #为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog
used_memory_startup:531728  #服务启动时消耗的内存
used_memory_dataset:44600  #数据占用的内存大小,即used_memory - used_memory_overhead
used_memory_dataset_perc:23.61%  # 数据占用的内存大小的百分比,(used_memory_dataset/(used_memory-used_memory_startup)) * 100%
allocator_allocated:816648  #分配器分配的内存
allocator_active:1277952  #分配器活跃的内存
allocator_resident:8589312 #分配器常驻的内存
total_system_memory:16709812224  # 操作系统内存大小
total_system_memory_human:15.56G
used_memory_lua:37888    #Lua引擎所使用的内存大小
used_memory_lua_human:37.00K
used_memory_scripts:0   # 脚本所使用的内存大小
used_memory_scripts_human:0B
number_of_cached_scripts:0  # 缓存脚本的数量
maxmemory:2147483648   #最大内存限制
maxmemory_human:2.00G
maxmemory_policy:noeviction  #达到maxmeory时的内存淘汰策略
allocator_frag_ratio:1.56   #分配器的碎片率
allocator_frag_bytes:461304 # 分配器的碎片大小
allocator_rss_ratio:6.72  # 分配器常驻内存比例
allocator_rss_bytes:7311360  # 分配器的常驻内存大小
rss_overhead_ratio:1.47  #常驻内存开销比例
rss_overhead_bytes:4009984  #常驻内存开销大小
mem_fragmentation_ratio:18.54  #碎片率(used_memory_rss / used_memory)
mem_fragmentation_bytes:11919680 #内存碎片大小
mem_not_counted_for_evict:634  #被驱逐的内存
mem_replication_backlog:0 #复制积压缓冲区内存
mem_clients_slaves:0 #slave节点客户端消耗内存
mem_clients_normal:143544 #所有常规客户端消耗内存
mem_aof_buffer:640  #AOF使用内存
mem_allocator:jemalloc-5.1.0  #内存分配器,在编译时选择
active_defrag_running:0 #0表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行
lazyfree_pending_objects:0 # 0表示不存在延迟释放的挂起对象数量
lazyfreed_objects:0 # 已延迟释放的对象数量

以上是redis6.2版本的内存相关的参数,比较老的版本可能没有这么多参数。

内存相关操作

1、限制最大内存

使用redis的时候最好能限制最大使用内存,防止被系统OOM,导致服务出现异常;设置最大内存,可以自动根据配置的策略,自动清理key,腾出内存空间。

但是需要注意的是,要确保缓存数据在其他地方也有保存,负责被自动清理掉是找不回来的。

可以直接在配置文件里面直接添加

maxmemory 4gb

也可以通过命令修改然后保存到配置文件(适合正在运行中的实例)

config set maxmemory 4gb;
config rewrite;

比较老的版本可能不支持gb这种单位,只支持字节(byte),需要将4gb转换成4*1024*1024*1024=4294967296,然后再setconfig rewrite就是为了修改配置文件的。

2、在集群中,发现主机的内存不够用了!

集群一般一台主机开启了多个实例,虽然使用内存used_memory还没有达到max_memory但是主机的内存使用率已经出现告警了。

可以通过INFO MEMORYmem_fragmentation_ratio看出碎片比率,正常(1,1.6),大于比例说明内存碎片严重。

如果碎片率不高,就需要扩容机器了。

如果碎片率高,老版本可以重启一下从节点以释放内存碎片。

redis4开始可以手动开启自动清理内存碎片

config set activedefrag yes

默认没有开启,会影响性能。等内存降下记得关闭起来。

还有一个命令:

memory purge

此命令是手动清理内存碎片,以一个I/O事件的形式注册到主线程当中去执行。仅在使用jemalloc作为分配器时才可用。