前言
今天说的是一个老问题了,关于 Redis 内存碎片的回收,以前用过几次,今天再次使用时发现自己没总结,没有可以拿来直接用的命令,花了一些时间去查找和测试,为了以后使用时更方便,我决定把整理一下放在这,等待再次相遇。
预制命令
- 查询内存情况
1 | [root@server ~]# redis-cli -a "password" info memory |
- 查询是否开启了自动清理碎片
1 | [root@server ~]# redis-cli -a "password" config get activedefrag |
- 开启碎片自动清理
1 | [root@server ~]# redis-cli -a "password" config set activedefrag yes |
- 关闭碎片自动清理
1 | [root@server ~]# redis-cli -a "password" config set activedefrag no |
聊聊背后的东西
上面已经把命令都烹饪好了,接下来可以聊聊背后的东西。
先学个单词 defrag
/dɪˈfræɡ/,“整理磁盘碎片”的意思,后面的内容大部分都和这个单词有关。
Redis 的数据都存储在内存中,当我们的应用程序频繁修改 Redis 中的数据,特别是删除大量的Key时,就有可能会导致 Redis 产生内存碎片,或者是一些内存剩余,其实Redis删除Key之后使用的内存肯定少了,但是它不一定会释放出来,有时也算是一种预先分配的机制,就比如他的数据只有1个G,但是有可能申请1.2个G的空间,这样在添加新的key时,通常立马就可以使用,不必再去申请新的内存了。
过多的内存碎片会降低 Redis 的内存使用率,通过Redis 的 info memory
命令,查到内存使用率 mem_fragmentation_ratio:1.17
,这个值的计算比较简单:
mem_fragmentation_ratio = used_memory_rss / used_memory
其中 used_memory
表示 Redis 存储数据的内存大小,used_memory_rss
表示操作系统实际分配给 Redis 进程的内存大小。
Redis 从 4.0 版本开始,提供了自动碎片整理的功能,可以通过配置开启碎片自动整理,也可以
如果你使用的是 Redis 4.0 以下版本,只能通过重启实例来解决
如果你使用的是 Redis 4.0 版本,它正好提供了自动碎片整理的功能,可以通过配置开启碎片自动整理,开启内存碎片整理必然会占用服务器的计算资源,这可能会导致 Redis 性能下降。所以是否开启这个功能,最好提前测试评估
究其原因,Redis 的碎片整理工作也是在主线程中执行的,当其进行碎片整理时,肯定会会消耗 CPU 计算资源,产生更多的耗时,从而可能影响到客户端的请求。
Redis 碎片整理的参数配置如下:
1 | # 开启自动内存碎片整理(总开关) |
本机查询情况如下:
1 | [root@server ~]# redis-cli -a "password" config get activedefrag |
总结
- Redis 从 4.0 版本开始,提供了自动碎片整理的功能,可以通过配置开启碎片自动整理
- 内存查询
info memory
, 查询碎片整理是否开启config get activedefrag
- 开启碎片整理
config set activedefrag yes
- 关闭碎片整理
config set activedefrag no
不畏浮云遮望眼,只缘身在最高层。真的是这样吗?如果你太高了浮云遮住了你向下望的眼睛呢?太低看不到高处,而太高又看不清地处了呀~
2024-10-24 20:15:17