Redis里头要是想根据前缀删数据,有啥快速又靠谱的办法呢?
- 问答
- 2025-12-30 07:58:03
- 1
这个问题是Redis使用中非常经典的一个场景,比如你想清理所有以“user_session:”开头的键,或者清理某个测试环境的一大批临时数据,直接上结论:没有一种完美无缺、一招鲜吃遍天的办法,你需要根据数据量大小、对服务的影响容忍度以及运维的便捷性来权衡选择。
最直接、最广为人知,但也最需要谨慎使用的方法就是 KEYS命令配合DEL命令。
具体操作是,你先用 KEYS "your_prefix*" 这个命令找出所有匹配的键。KEYS "cache:*" 会列出所有以“cache:”开头的键,拿到这个键列表之后,再用一个 DEL 命令把它们删掉。
为什么这个方法被普遍认为是不靠谱的呢? 原因就在 KEYS 命令本身,根据Redis官方文档(来源:Redis官方文档对KEYS命令的说明)明确指出,KEYS 命令会在数据库中遍历所有的键,然后一次性返回所有匹配的结果,如果你的Redis数据库里有几百万、几千万个键,那么执行 KEYS 命令的瞬间,会严重阻塞Redis服务器,导致其他所有请求都被卡住,直到它遍历完成为止,这在生产环境下是灾难性的,很可能引起服务雪崩,业界有一个非常重要的原则:绝对不要在线上生产环境使用 KEYS 命令。
既然KEYS这么危险,有什么更“温柔”一点的替代方案呢?这就引出了第二个方法:使用 SCAN 命令迭代式地删除。
SCAN 命令的设计初衷就是为了解决 KEYS 命令的阻塞问题,它不是一次性返回所有结果,而是通过游标的方式,一次只扫描一小部分键,返回一小批匹配的键,你可以理解为,它不是“倾盆大雨”,而是“毛毛雨淅淅沥沥地下”。(来源:Redis官方文档对SCAN命令的说明)
它的用法稍微复杂一点,需要写一个脚本来循环执行,大概的步骤是:
- 第一次执行
SCAN 0 MATCH your_prefix* COUNT 100,这里的0表示从头开始扫描,MATCH后面跟匹配模式,COUNT是建议每次迭代返回的键数量(注意只是个建议值,返回的数量可能或多或少)。 - 命令会返回两个值:一个是下一次迭代需要用的新游标(
12345),另一个是本次扫描到的键的列表。 - 你对这一小批键执行
DEL命令进行删除。 - 然后拿着返回的新游标(
12345),再次执行SCAN 12345 MATCH your_prefix* COUNT 100。 - 重复这个过程,直到返回的游标值变为
0,表示整个数据库已经遍历完毕。
这种方法的好处是,它将一个巨大的、阻塞性的操作,拆分成无数个小的、非阻塞(或者说是微阻塞)的操作,在每次执行 SCAN 和删除一小批键的间隙,Redis服务器依然可以正常处理其他客户端的请求,对服务的影响降到很低,这是目前在生产环境下最常用、最推荐的脚本化删除方式。
SCAN 方式虽然温柔,但它在整个删除过程中,Redis的内存并不会立即释放,而是要等到后续的内存回收机制来处理,如果删除的量非常大,这个脚本也需要跑一段时间。
除了上面两种需要自己“手动”操作的方法,还有一个“大杀器”级别的方案,适合在业务规划阶段就提前考虑,那就是通过设置TTL(过期时间)让数据自动失效。
如果你的这些带前缀的数据本身就有生命周期的概念,比如用户会话、临时缓存等,最理想的方式是在写入这些键的时候,就直接给它们设置一个过期时间(使用 SETEX 命令或 EXPIRE 命令),这样,Redis会在后台自动清理过期的键,你完全不需要主动去删除,这是一种“治本”的思路,将清理成本分摊到了整个运行周期中,对服务完全没有额外影响,但它的局限性也很明显:只适用于有自然生命周期的数据。
还有一种“终极大法”,听起来有点粗暴但有时很有效,尤其适用于需要清空整个数据库或者可以接受短暂服务中断的场景:执行 FLUSHDB 或 FLUSHALL 命令。
FLUSHDB 是清空当前数据库的所有数据,FLUSHALL 是清空Redis服务器上所有数据库的数据,这两个命令的执行速度非常快,因为它是直接释放整个数据库的内存,它的破坏力也是核弹级别的,会误伤所有无辜的键,这个方法通常只在测试环境、或者需要紧急清空所有数据的极端情况下使用,使用时务必确认当前连接的数据库是否正确,并做好数据备份。
根据前缀删除数据:
- 绝对禁止在生产环境使用
KEYS。 - 常规推荐使用
SCAN脚本,渐进式删除,对服务影响小。 - 上策是设计数据时加上TTL,让Redis自动清理。
- 极端情况或测试环境可考虑
FLUSHDB,但务必小心。
没有最快的,只有最合适的,选择哪种方法,一定要结合你的实际业务场景和运维要求来决定。

本文由盘雅霜于2025-12-30发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://www.haoid.cn/wenda/71146.html
