Redis生产环境批量的key需要删除,如何优雅实现且不影响线上环境?有密码认证的如何实现批量删除?有哪些实现方法?

Redis生产环境批量的key需要删除,如何优雅实现且不影响线上环境?有密码认证的如何实现批量删除?有哪些实现方法?

在 Redis 命令行中删除匹配某个模式的 key,最推荐 的方式是使用 redis-cli --scan 配合管道,避免阻塞服务。

推荐方式:非阻塞删除

bash 复制代码
# 匹配并删除(使用 xargs)
redis-cli --scan --pattern "user:*" | xargs redis-cli del

# 如果 key 包含空格,使用 -0 参数安全处理
redis-cli --scan --pattern "user:*" | xargs -0 redis-cli del

# Redis 4.0+ 建议用 UNLINK 代替 DEL(异步删除,不阻塞)
redis-cli --scan --pattern "user:*" | xargs redis-cli unlink

交互式方式:SCAN + DEL

如果在 redis-cli 交互模式中,或需要更精确控制:

bash 复制代码
# 使用 SCAN 渐进式遍历(不会阻塞 Redis)
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 100
1) "17"                          # 下次游标
2) 1) "user:1001"
   2) "user:1002"
   3) "user:1003"

# 然后对返回的 key 逐个删除
127.0.0.1:6379> DEL user:1001 user:1002 user:1003

脚本批量删除(生产环境推荐)

对于大量 key,建议写个小脚本循环 SCAN:

bash 复制代码
#!/bin/bash
# 安全删除匹配 key 的脚本
cursor=0
while true; do
    result=$(redis-cli SCAN $cursor MATCH "user:*" COUNT 100)
    cursor=$(echo "$result" | head -n 1)
    keys=$(echo "$result" | tail -n +2)
    
    if [ -n "$keys" ]; then
        echo "$keys" | xargs redis-cli unlink
    fi
    
    [ "$cursor" == "0" ] && break
done

⚠️ 避免使用 KEYS + DEL

bash 复制代码
# 以下命令仅适用于测试环境/数据量极小的情况
# 生产环境绝对不要这样做!会阻塞整个 Redis 实例
redis-cli KEYS "user:*" | xargs redis-cli del   # ❌ 危险

对比总结

方式 是否阻塞 适用场景
KEYS + DEL ✅ 严重阻塞 仅测试环境,key 数量 < 1000
SCAN + DEL/UNLINK ❌ 不阻塞 生产环境标准做法
redis-cli --scan ❌ 不阻塞 命令行快速操作
UNLINK ❌ 异步删除 Redis 4.0+ 大量删除首选

核心原则 :生产环境永远优先使用 SCANUNLINK,避免 KEYSDEL 大量 key。


如果你已经在 redis-cli 交互模式里,key 数量只有 100 个左右,可以直接这样操作:

最简单的方式:先查再删

bash 复制代码
# 1. 列出匹配的 key
127.0.0.1:6379> keys user:*

# 2. 复制返回的 key 列表,直接执行 del
127.0.0.1:6379> del user:001 user:002 user:003 ... 

100 个 key 手动复制粘贴虽然麻烦,这是最稳妥的方式。


如果想在交互模式里批量处理

Redis 交互模式本身不支持管道或循环,但你可以:

方式一:退出交互模式,用 shell 一句话搞定

bash 复制代码
# 先 quit 退出 redis-cli,然后在 bash 里执行
redis-cli keys "user:*" | xargs redis-cli del

方式二:用 EVAL 执行 Lua 脚本(无需退出)

bash 复制代码
127.0.0.1:6379> EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 user:*

⚠️ 注意:unpack 在 key 数量很多时会报 "too many results" 错误,1000 个一般没问题。

方式三:分步 SCAN + DEL(最安全)

bash 复制代码
127.0.0.1:6379> scan 0 match user:* count 100
1) "0"
2) 1) "user:001"
   2) "user:002"
   ... 

# 如果游标返回 0,说明遍历完了,然后手动 del
127.0.0.1:6379> del user:001 user:002 ...

相关推荐
辉灰笔记43 分钟前
Redis6.0.10升级迁移至Redis7.4.6(修复CVE‑2025‑49844,业务无需重启)
redis·redis7·漏洞修复·数据库迁移·redis平滑升级·cve-2025-49844
一技安身1 小时前
【信创】docker-26.0.2.tgz 原理 + 完整安装
linux·运维·服务器
Dachui_11221 小时前
内网穿透 Webhook 告警实战:客户端离线、应用探测、资源删除全覆盖
运维·远程工作·内网穿透·devops·webhook·服务器监控·应用探测
数据智研1 小时前
【数据分享】300个城市-5G试点城市DID数据(2014-2025)
大数据·运维·人工智能·信息可视化·数据分析
honsor2 小时前
工业级网口温湿度变送器 ModbusTCP 机房动环环境监测终端
运维·网络·人工智能·物联网·安全·云计算·智能温湿度监测系统
fengkai45452 小时前
八、Docker详解1-3
运维·docker·容器
流浪0012 小时前
Linux系统篇34——信号(六):信号处理期间又来了怎么办?——sigaction、sa_mask、可重入函数与 volatile
linux·运维·面试·操作系统·信号处理·信号
学烹饪的小胡桃3 小时前
资产设备管理系统 WGFIX 怎么设置https访问
linux·运维·服务器·网络·安全
sdm0704273 小时前
Linux 中安装 Redis 5
redis
志栋智能4 小时前
超自动化巡检如何生成“有灵魂”的运维报告?
大数据·运维·人工智能·架构·自动化