Redis自动清理内存那些事儿,怎么自动化让内存用得更顺畅一点
- 问答
- 2026-01-25 23:54:04
- 15
Redis自动清理内存那些事儿,怎么自动化让内存用得更顺畅一点

直接说重点,想让Redis自己把内存用得顺畅,主要靠三件事:设置过期时间、选对淘汰策略、收拾内存碎片,下面咱们就掰开揉碎了说。

第一件事:给数据上个“闹钟”(设置过期时间)
这是最基本也最有效的自动清理方法,你往Redis里放数据的时候,顺手就给它定个“存活时间”,比如验证码缓存10分钟,热门文章列表缓存1小时,时间一到,Redis会自动删除这些数据,腾出空间,这就像给每件东西贴了个过期标签,仓库管理员(Redis)会定期检查并把过期的扔掉。
怎么实现呢?很简单,用EXPIRE命令或者在你存数据的时候直接用SET key value EX seconds,对于一批有固定模式(比如都叫session:*)的键,可以用redis-cli找出来批量设置,但注意,别一次性扫描全部键,用SCAN命令分批扫,不然可能会卡住。(来源:Redis官方文档关于键过期的说明)

第二件事:定好“仓库满员”时的规矩(配置内存淘汰策略)
如果内存满了,而新数据又急着要进来,怎么办?这时候就得靠“淘汰策略”了,Redis不是死板的,它提供了好几条规矩让你选,在配置文件redis.conf里设置maxmemory-policy就行。
常用的规矩有:
allkeys-lru:比较推荐,不管数据有没有设过期时间,当内存不够,就挑“最近最少用”的数据淘汰,这符合常识,不常用的先清走。volatile-lru:只从那些设置了过期时间的数据里,淘汰“最近最少用”的。allkeys-random:随机挑一个键淘汰,简单粗暴。volatile-ttl:从设了过期时间的数据里,挑那个“剩余寿命最短”的赶紧淘汰。noeviction:默认策略,不淘汰,新数据写不进去就报错,生产环境一般不用,容易导致服务中断。 选哪个?如果你的应用里数据访问有冷热区别,用allkeys-lru准没错,如果所有数据都差不多重要,只是临时缓存,那用volatile-lru或volatile-ttl也行。(来源:Redis官方文档关于内存淘汰策略的章节)
第三件事:定期“整理仓库”(处理内存碎片)
Redis用久了,就像房间东西搬进搬出,会留下很多小空隙,这就是内存碎片,明明总空间还有,但都是小块的,存不下大东西,这时候就需要整理了。
从Redis 4.0开始,有个叫“主动碎片整理”的功能,在redis.conf里,通过activedefrag yes就能开启,开启后,Redis会在后台慢慢地把数据挪动位置,把碎片拼成大块连续空间,这个过程是自动的,并且会小心控制CPU使用率,不影响正常服务,你可以设置触发整理的碎片率阈值(active-defrag-ignore-bytes和active-defrag-threshold-lower),比如内存碎片超过1GB且碎片率超过10%时才开始整理。(来源:Redis官方博客关于主动碎片整理的介绍)
怎么更自动化、更顺畅? 光有上面三点还不够,得让它们“活”起来:
- 监控与告警是眼睛:用
INFO memory命令或者监控工具(如Prometheus),时刻盯着used_memory(用了多少)和mem_fragmentation_ratio(碎片率),设置告警,比如内存使用超过80%或碎片率大于1.5就发通知,让你提前介入。 - 动态调整过期时间:对于某些数据,可以根据时间或业务状态灵活调整过期时间,比如半夜访问少,可以把一些缓存时间设长点;白天访问多,就设短点,让缓存周转更快,这需要写点小脚本。
- 区分业务,分实例存储:别把所有数据塞进一个Redis,把重要的、需要长期保存的数据(如用户关系)和临时的缓存数据(如页面片段)分到不同的Redis实例上,这样缓存实例可以配置更激进的淘汰策略,即使清了也不心疼,核心数据则安全无忧。
- 定期“重启大法”好:对于长期运行、碎片严重的Redis,在业务低峰期做个主从切换,重启一下从库,内存分配会焕然一新,这是效果最明显的“整理”方法,但需要架构支持。
让Redis内存用得更顺畅,核心思想是 “预防为主,整理为辅,监控兜底” ,通过给数据设定合理的生命周期、制定满员时的清理规矩、并定期整理碎片,再配上监控告警,就能在很大程度上实现自动化管理,让你的Redis跑得既轻快又稳当。(综合参考:《Redis设计与实现》一书、阿里云开发者社区相关实践文章、Redis Labs技术博客)
本文由召安青于2026-01-25发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://dilx.haoid.cn/wenda/85960.html