2025年8月更新:根据Redis最新发布的7.2.4版本说明,KEYS命令在大数据量下的性能问题依然存在,官方再次强调推荐使用SCAN结合DEL的方式替代直接使用通配符删除,特别是在生产环境中,这一建议自Redis 6.0以来一直未变,但很多开发者仍然忽略了这一最佳实践。
Redis的DEL命令是日常开发中最常用的命令之一,它的基本功能很简单——删除指定的一个或多个键,语法格式如下:
DEL key [key ...]
比如你想删除一个名为"user:1001"的键,只需要执行:
DEL user:1001
也可以一次删除多个明确的键:
DEL user:1001 user:1002 user:1003
但问题来了——当你需要删除一批符合特定模式的键时,比如所有以"cache:"开头的键,该怎么办呢?
首先需要明确的是:Redis的DEL命令本身并不直接支持通配符,这与很多人第一印象可能不同,不过别担心,我们有完整的解决方案。
Redis支持的通配符模式主要用在KEYS和SCAN命令中,遵循以下规则:
匹配任意单个字符
h?llo
匹配 hello, hallo, hxllo等匹配任意数量的字符(包括零个)
h*llo
匹配 hllo, hello, haaaallo等[]
匹配括号内的任一字符
h[ae]llo
只匹配 hallo 和 hello[a-z]
, [0-9]
\
用于转义特殊字符
h\?llo
就只匹配字面的"h?llo"这是最直观的方法,但生产环境慎用:
redis-cli KEYS "user:*" | xargs redis-cli DEL
或者更安全的写法:
redis-cli --raw KEYS "cache:*" | xargs -r redis-cli DEL
为什么生产环境不推荐?
这是官方推荐的方式,不会阻塞服务:
redis-cli --scan --pattern "session:*" | xargs -L 1000 redis-cli DEL
这里的关键点:
--scan
使用SCAN而非KEYS-L 1000
每批删除1000个键,避免大事务--count
参数调整每次扫描的数量对于需要原子性保证的场景:
local keys = redis.call('SCAN', 0, 'MATCH', ARGV[1], 'COUNT', 1000) if #keys[2] > 0 then return redis.call('DEL', unpack(keys[2])) else return 0 end
执行方式:
redis-cli --eval del_pattern.lua , "temp:*"
案例1:清理过期缓存
假设你的缓存键都是"cache:<类型>:
redis-cli --scan --pattern "cache:product:*" | xargs -L 500 redis-cli DEL
案例2:删除特定格式的会话 会话键格式为"session:<用户ID>:<设备ID>",删除某用户所有会话:
redis-cli --scan --pattern "session:1001:*" | xargs redis-cli DEL
案例3:按月清理日志 日志键格式为"log:2025-07-*",清理7月份所有日志:
redis-cli --scan --pattern "log:2025-07-*" | xargs -L 1000 redis-cli DEL
redis-cli --scan --pattern "temp:*" | xargs -n 1000 | redis-cli --pipe
Q:为什么直接执行DEL不支持通配符? A:主要是出于性能和安全考虑,Redis设计哲学是保持基本命令的简单高效,复杂功能通过组合命令实现。
Q:SCAN和KEYS的性能差异有多大? A:在测试环境中,一个有100万键的DB,KEYS可能导致100ms以上的阻塞,而SCAN几乎无感知。
Q:通配符匹配会影响性能吗? A:匹配模式本身开销很小,主要开销来自键空间遍历,越精确的模式通常性能越好。
Q:有没有删除超大量键(百万级)的特别技巧? A:可以考虑以下策略:
在Redis的世界里,批量删除操作就像打扫房间——有计划、分步骤地进行,比一次性大扫除要稳妥得多!
本文由 璩淼 于2025-08-06发表在【云服务器提供商】,文中图片由(璩淼)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/550377.html
发表评论