当前位置:首页 > 问答 > 正文

Redis命令 通配符用法 Redis中del命令如何使用通配符,redis的del支持哪些通配符

Redis命令 | 通配符用法:DEL命令如何高效删除匹配键

2025年8月更新:根据Redis最新发布的7.2.4版本说明,KEYS命令在大数据量下的性能问题依然存在,官方再次强调推荐使用SCAN结合DEL的方式替代直接使用通配符删除,特别是在生产环境中,这一建议自Redis 6.0以来一直未变,但很多开发者仍然忽略了这一最佳实践。

Redis DEL命令基础

Redis的DEL命令是日常开发中最常用的命令之一,它的基本功能很简单——删除指定的一个或多个键,语法格式如下:

DEL key [key ...]

比如你想删除一个名为"user:1001"的键,只需要执行:

DEL user:1001

也可以一次删除多个明确的键:

DEL user:1001 user:1002 user:1003

但问题来了——当你需要删除一批符合特定模式的键时,比如所有以"cache:"开头的键,该怎么办呢?

Redis通配符的基本规则

首先需要明确的是:Redis的DEL命令本身并不直接支持通配符,这与很多人第一印象可能不同,不过别担心,我们有完整的解决方案。

Redis支持的通配符模式主要用在KEYS和SCAN命令中,遵循以下规则:

  1. 匹配任意单个字符

    • h?llo 匹配 hello, hallo, hxllo等
  2. 匹配任意数量的字符(包括零个)

    Redis命令 通配符用法 Redis中del命令如何使用通配符,redis的del支持哪些通配符

    • h*llo 匹配 hllo, hello, haaaallo等
  3. [] 匹配括号内的任一字符

    • h[ae]llo 只匹配 hallo 和 hello
    • 支持范围表示法,如 [a-z], [0-9]
  4. \ 用于转义特殊字符

    • h\?llo 就只匹配字面的"h?llo"

实际工作中删除匹配键的三种方法

方法1:KEYS + DEL组合(适合开发环境)

这是最直观的方法,但生产环境慎用

redis-cli KEYS "user:*" | xargs redis-cli DEL

或者更安全的写法:

redis-cli --raw KEYS "cache:*" | xargs -r redis-cli DEL

为什么生产环境不推荐?

  • KEYS命令会阻塞Redis服务,直到遍历完所有键
  • 在包含数百万键的数据库上可能导致服务短暂不可用

方法2:SCAN + DEL组合(生产推荐)

这是官方推荐的方式,不会阻塞服务:

Redis命令 通配符用法 Redis中del命令如何使用通配符,redis的del支持哪些通配符

redis-cli --scan --pattern "session:*" | xargs -L 1000 redis-cli DEL

这里的关键点:

  • --scan 使用SCAN而非KEYS
  • -L 1000 每批删除1000个键,避免大事务
  • 可以添加--count参数调整每次扫描的数量

方法3:Lua脚本原子操作

对于需要原子性保证的场景:

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命令 通配符用法 Redis中del命令如何使用通配符,redis的del支持哪些通配符

redis-cli --scan --pattern "log:2025-07-*" | xargs -L 1000 redis-cli DEL

性能优化建议

  1. 批量大小:根据网络延迟和键大小调整批量值,通常500-5000之间
  2. 管道技术:对于大规模删除,考虑使用Redis管道
    redis-cli --scan --pattern "temp:*" | xargs -n 1000 | redis-cli --pipe
  3. 避开高峰:大数据量删除操作安排在业务低峰期
  4. 分片考虑:如果是集群环境,需要在每个节点上执行

常见问题解答

Q:为什么直接执行DEL不支持通配符? A:主要是出于性能和安全考虑,Redis设计哲学是保持基本命令的简单高效,复杂功能通过组合命令实现。

Q:SCAN和KEYS的性能差异有多大? A:在测试环境中,一个有100万键的DB,KEYS可能导致100ms以上的阻塞,而SCAN几乎无感知。

Q:通配符匹配会影响性能吗? A:匹配模式本身开销很小,主要开销来自键空间遍历,越精确的模式通常性能越好。

Q:有没有删除超大量键(百万级)的特别技巧? A:可以考虑以下策略:

  1. 按模式分批(如先删cache:a,再cache:b
  2. 使用后台任务逐步删除
  3. 在从节点执行,然后主从切换

在Redis的世界里,批量删除操作就像打扫房间——有计划、分步骤地进行,比一次性大扫除要稳妥得多!

发表评论