其中:
- used_memory_rss:代表Redis进程占用的总物理内存大?。ò??肭?⑹?萸?投颜坏龋?,单位是字节 。
- used_memory:代表Redis分配器申请的内存总量,也就是从操作系统角度看进程实际使用的虚拟内存空间,单位是字节 。
- 大于1:说明内存有碎片,通常在1到1.5之间是正常的 。
- 大于1.5:说明内存碎片率比较大,需要考虑是否要进行内存碎片清理,要引起重视 。
- 小于1:说明已经开始使用交换内存 , 也就是使用硬盘了,正常的内存不够用了 , 需要考虑是否要进行内存的扩容,使用swap是相当影响性能的 。
当Redis重新启动时,它会通过RDB持久化功能将数据存储到磁盘,然后再从磁盘加载数据到内存 , 这个过程可以有效地清理内存碎片 。但这种方法会导致服务的临时中断 。
2.高于4.0-RC3版本的RedisRedis4.0-RC3版本开始,引入了active-defrag 特性 。可以在不重启的情况下,自动进行碎片清理 。
开启配置如下,此选项的默认值是关闭的,激活碎片整理可能会占据一些 CPU 时间 。
redis> config set activedefrag yes
注意:自动清理内存碎片的功能需要该Redis的内存分配器是jemalloc时才能启用 。启用后需要同时满足下面2个参数的设置条件时才会触发自动清理:
active-defrag-ignore-bytes 100mb# 默认100MB,表示内存碎片空间达到100MB时active-defrag-threshold-lower 10# 默认10,表示内存碎片空间占OS分配给redis的物理内存空间的比例达到10%时
redis是单进程模型,内存碎片自动清理是通过主线程操作的,也会消耗一定的CPU资源 。为了避免自动清理降低Redis的处理性能 , 如下两个参数可以控制清理动作消耗的CPU时间比例的上下限:active-defrag-cycle-min 5# 默认5,表示自动清理过程所用 CPU 时间的比例不低于5% , 保证清理能正常开展;active-defrag-cycle-max 75 # 默认75,表示自动清理过程所用 CPU 时间的比例不高于 75%,一旦超过 , 就停止清理,从而避免在清理时,大量的内存拷贝阻塞 Redis,导致响应延迟升高 。
如果你对自动清理的效果不满意,可以使用如下命令,直接进行手动碎片清理:redis > memory purge
需要注意的是 , 该命令会阻塞主进程,并且目前也仅实现了jemalloc作为内存分配器的内存统计 , 对其他分配器暂不支持 。本篇文章到这就结束了 。在我们深入研究Redis内存碎片管理和优化策略后,可以明确一点:理解并合理处理内存碎片化对于保证Redis的性能及稳定性至关重要 。
不论是进行内存分配策略的调整 , 还是使用适当的数据结构,都是对Redis内存管理的优化 。
同时,定期的监控和审视也是必不可少的步骤 。希望本文能为你在处理Redis内存碎片问题上提供一些有价值的启示 。记?。?每一个优秀的工程师都应该以理解其使用的工具为荣 。让我们持续关注和优化Redis,使其更好地服务于我们的项目,推动业务的发展 。
【Redis内存碎片:深度解析与优化策略】
推荐阅读
- Redis中的三种特殊类型
- Redis中的Big Key问题:排查与解决思路
- 离职“必删清单”:释放内存,轻装上阵,开启新篇章!这些事情你需要马上做!
- 在SpringBoot中通过Canal实现MySQL与Redis的数据同步
- MySQL如何与Redis保持数据一致性?
- 学透 Redis HyperLogLog,看这篇就够了
- 一文读懂 Redis 缓存系统
- 手撕 Golang 高性能内存缓存库 bigcache!
- Redis Stream 数据结构实现原理真的很强
- Go语言开发者的Apache Arrow使用指南:内存管理