不能直接用del prefix*删除前缀键,因del不支持通配符;生产环境禁用keys因其全库扫描会阻塞主线程;应使用scan+批量del,控制count参数并攒批删除;高频场景可用lua脚本原子执行,注意del参数不超过1000个。

不能直接用 DEL prefix* 删除前缀键——Redis 的 DEL 命令不支持通配符,这么做只会尝试删一个叫 prefix* 的字面量键,返回 0。
为什么 KEYS 在生产环境要禁用
很多人第一反应是:KEYS prefix* 拿到所有键再 DEL。这在开发或小数据量时可行,但线上必须避开:
-
KEYS是全库扫描,会阻塞 Redis 主线程,期间无法处理其他请求 - 键数量超 10 万时,CPU 占用飙升,可能触发运维告警甚至被自动禁用命令
- 部分云 Redis(如阿里云、腾讯云)默认禁用
KEYS,执行直接报错(error) ERR unknown command `KEYS`, with args beginning with: - 即使成功,一次性把几百万键加载进客户端内存,容易 OOM
用 SCAN + 批量 DEL 是安全底线
SCAN 是游标式遍历,每次只取一批(比如 1000 个),不阻塞服务,适合生产环境。关键不是“怎么写”,而是“怎么控制节奏”:
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
- 务必设置
count参数(如count 500),否则默认只返回 10 个,效率极低 - 匹配模式写成
prefix*:*或prefix*都可以,但注意*是通配符,不是正则;prefix\*这种转义无效 - 不要在单次
SCAN循环里调用DEL逐个删——网络往返开销大;应攒够一批(如 100 个)再DEL一次 - Python 示例中,
r.scan(cursor=cursor, match='user:*', count=500)返回的是(new_cursor, keys_list),需循环直到new_cursor == 0
高并发场景下优先考虑 Lua 脚本
如果删除操作频繁、键量稳定(比如每天定时清 tmp:*),Lua 脚本能减少客户端-服务端来回,且原子执行:
- 脚本内用
redis.call('scan', ...)分批获取,再用redis.call('del', ...)批量删,避免中间状态残留 - 注意:Lua 中
del最多支持 1000 个参数,所以每批别超过这个数,否则报错(error) ERR Error running script (call to f_...): @user_script:4: ERR wrong number of arguments - 示例片段:
local cursor = 0 repeat local res = redis.call('scan', cursor, 'match', 'log:*', 'count', 100) cursor = tonumber(res[1]) if #res[2] > 0 then redis.call('del', unpack(res[2])) end until cursor == 0 return true - 用
redis-cli --eval或客户端eval方法执行,别手敲——脚本里换行和引号容易出错
真正容易被忽略的点是:没有确认删除是否真正完成。SCAN 可能因 key 动态增删而漏掉,建议删完再用 SCAN 对同一 pattern 查一次,确认返回空数组;另外,如果键带过期时间(TTL),DEL 后不会触发惰性删除,但内存释放有延迟,别立刻看 info memory 做判断。










