Redis键删除策略帮你省缓存资源,配置起来其实没那么复杂
- 问答
- 2025-12-31 06:40:09
- 3
(引用来源:Redis官方文档,阿里云开发者社区,部分技术博客观点)
说起用Redis做缓存,有个事儿特别让人头疼,就是缓存数据怎么清理,你想想,内存多贵啊,要是那些再也没人用的数据一直赖在Redis里占着地方,这不就是白白浪费钱吗?Redis里面有个特别重要的机制,就是键的删除策略,说白了,就是定个规矩,告诉Redis什么时候、用什么方式把那些“过期”的或者“没用”的键给扔掉,好腾出地方给新的热点数据。
你可能觉得这事儿挺复杂的,得写一堆高深的配置,其实不然,Redis已经给我们准备好了几种现成的策略,咱们只需要根据自己业务的脾气秉性,选一个最合适的就行,配置起来,也就是改一两行配置文件的事儿。
第一种策略,叫“定时删除”。 这个最好理解,就是当你给一个键设置过期时间的时候,set key value ex 60,表示60秒后过期,Redis就会设置一个定时器,时间一到,“啪”一下就立刻把这个键删掉,这听起来很干脆利落,对吧?对内存是最友好的,过期键一刻也不多留,但它的缺点也很明显,想想看,如果Redis里面有成千上万个键同时过期,那么定时器就会在同一时刻触发大量的删除操作,这会消耗很多CPU资源,可能会让Redis主线程卡顿一下,影响到处理正常命令的速度,这种策略属于“用CPU换内存”,适合那些对内存极度敏感,但能接受偶尔有点性能波动的场景,实际上Redis并不完全采用这种“纯”定时删除,因为它对CPU不太友好。

(引用来源:Redis核心设计与实现)Redis采用的是惰性删除和定期删除相结合的混合策略,这也是它聪明的地方,在内存和CPU之间找了个平衡。
第二种策略,惰性删除”。 这个策略很“懒”,但非常有效,它的原则是:我不主动去检查谁过期了,等到你要用这个键的时候,我再看它过没过期,客户端发来一个 get key 的命令,Redis在返回数据之前,会先检查一下这个key的过期时间,如果发现已经过期了,那就立刻删除它,然后给客户端返回一个空值,好像这个键从来不存在一样,这个策略的优点是,删除操作只发生在真正有请求访问这个过期键的时候,所以对CPU非常友好,不会出现因为集中删除导致的卡顿,但缺点就是太被动了,如果一个键过期后,一直没人来访问它,那它就会一直像个幽灵一样占据着内存空间,成了“内存垃圾”,这就是典型的内存浪费。

第三种策略,是“定期删除”。 为了弥补“惰性删除”的不足,Redis又加入了“定期删除”机制,你可以把它想象成一个后台的清洁工,这个清洁工不会一刻不停地干活,而是每隔一段时间就主动出来溜达一圈,检查一下数据库里有没有过期的键,然后清理掉一部分,Redis会每隔100毫秒(默认值)就随机抽取一定数量的键(比如20个),检查它们是否过期,过期就删,如果这一批里面过期的键比例很高,说明内存里垃圾不少,清洁工就会再多抽查几批,直到过期的键比例降下来为止,这种策略是“主动”和“被动”的结合,它既不会像定时删除那样消耗大量CPU,也不会像惰性删除那样让垃圾长期滞留,是一种很好的折中方案,我们平时说的配置,主要就是调整这个定期删除的行为。
具体怎么配置呢?真的不复杂,关键参数就在Redis的配置文件 redis.conf 里,主要关注这两个:
- hz:这个参数默认是10,它代表清洁工(后台任务)一秒内跑多少次,hz 10就是一秒执行10次,也就是100毫秒一次,如果你发现Redis服务器CPU有富余,但内存里过期键清理得不够快,可以适当调高这个值,比如调到20或50,让清洁工跑得更勤快一些,但注意,调太高会增加CPU负担。
- maxmemory-policy:这个参数更重要,它决定了当Redis内存使用达到你设置的最大值(maxmemory)时,该怎么办,这算是最后一道防线了,它有几种模式让你选:
- volatile-lru:这是最常用的一种,它只针对那些设置了过期时间的键,当内存不够时,会尝试淘汰最近最少使用的(LRU算法)那些键。
- allkeys-lru:和上面类似,但范围是所有的键,不管有没有设过期时间。
- volatile-random:从设置了过期时间的键中,随机挑一个扔掉。
- allkeys-random:从所有键中随机挑一个扔掉。
- volatile-ttl:挺聪明的一个策略,它优先淘汰那些剩余存活时间最短的键,也就是快过期的键先扔,反正它马上也要过期了。
- noeviction:这个是默认值,但生产环境一般不这么用,它表示内存满了就直接报错,拒绝新的写入操作,这能保证数据不丢失,但服务可能就不可用了。
怎么选呢?给你个简单的建议:如果你的业务里,有些数据是永久有效的,有些是缓存会过期的,那就用 volatile-lru 或 volatile-ttl,只清理缓存数据,保住核心数据,如果你的Redis完全就当缓存用,里面所有数据都可以丢,那就用 allkeys-lru,这样能最大限度地利用内存。
所以你看,管理Redis的缓存资源,核心就是理解这几种删除策略的脾气,然后根据你的业务是“读多”还是“写多”,是“CPU紧张”还是“内存紧张”,像调音响旋钮一样,微调一下 hz 和 maxmemory-policy 这两个参数,根本不需要你去写复杂的清理脚本,Redis早就把这些脏活累活封装好了,咱们要做的,就是做个明智的选择,花十分钟看看配置文件,可能就能为你省下不少云服务器的内存费用,这笔账怎么算都划算。
本文由寇乐童于2025-12-31发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/71731.html
