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

用Redis远程怎么批量删数据,操作步骤和注意点分享

主要基于Redis官方文档的说明和常见的数据库运维实践经验)

第一步:连接上远程Redis服务器

你得像去朋友家一样,先找到地址并敲门进去,这里你需要三样东西:

  1. 远程服务器的IP地址或域名168.1.100 或者 redis.yourcompany.com
  2. 端口号:Redis默认的门牌号是6379,但如果管理员改了,你就需要用新的。
  3. 密码(如果需要的话):如果服务器设置了密码,你就必须出示密码才能进入。

连接的工具最常用的就是Redis自带的命令行客户端 redis-cli,在你自己电脑的命令行(终端)里输入这样的命令:

redis-cli -h your_redis_host -p your_redis_port -a your_password
  • your_redis_hostyour_redis_portyour_password 换成实际的信息。
  • 注意点1(安全):直接在命令里写密码可能会被系统记录在历史命令中,有泄露风险,更安全的方法是只输入 -h-p,连接成功后,Redis会提示你输入密码,那时候再输入,或者使用--askpass选项。

如果连接成功,命令行提示符会变成远程服务器的IP和端口,168.1.100:6379>,这说明你已经成功进入“房间”了。

第二步:搞清楚你要删哪些数据

在动手删除之前,绝对不能盲目,你需要精确地知道你要删除的键(Key)长什么样,Redis里的数据都是以键值对存放的,删除就是通过键来操作的。

常用的查看键的模式命令是 KEYS

  • 你想查看所有以 user:session: 开头的键(这可能代表所有用户的会话数据):
    KEYS user:session:*
  • 你想查看所有以 temp_cache: 结尾的键:
    KEYS *temp_cache:
  • 你想查看所有包含 log_202310(比如2023年10月的日志)的键:
    KEYS *log_202310*

注意点2(极其重要)KEYS 命令在生产环境中要极度谨慎使用,因为这个命令会遍历整个数据库的所有键,如果数据库非常庞大(比如有几百上千万个键),这个操作会暂时阻塞Redis服务器,导致其他所有请求卡住,可能引发服务瘫痪,最好在业务低峰期进行,或者通过其他方式(如从监控系统)提前确认好键的模式。

第三步:执行批量删除

确认了要删除的键的模式后,就可以开始删除了,批量删除主要使用 DEL 命令,但直接用它不能模糊匹配,所以需要结合其他方法。

使用 redis-cli--scan--pattern 选项(推荐)

这是最安全、最推荐的方法,因为它不会阻塞Redis服务,它的原理是分批逐步扫描键,然后一批批删除,命令不是在Redis命令行里执行,而是在你本地系统的命令行里,使用完整的 redis-cli 命令。

redis-cli -h your_redis_host -p your_redis_port -a your_password --scan --pattern "your_pattern*" | xargs redis-cli -h your_redis_host -p your_redis_port -a your_password del

这个命令看起来复杂,分解一下:

  1. redis-cli ... --scan --pattern "user:session:*":这部分是安全地扫描出所有匹配 user:session:* 的键,并逐行输出。
  2. (管道符):将前面命令的输出结果,传递给后面的命令处理。
  3. xargs:一个Linux/Mac工具,它接收前面传来的键列表,然后一个个地交给后面的 del 命令去执行删除。

注意点3:这种方法相比直接在服务内使用 KEYS 要安全得多,但对网络有一定要求,因为需要来回传输键的列表,如果匹配的键非常多(比如几十万个),可能会慢一些,但不会拖垮服务器。

使用 Lua 脚本

在Redis命令行里,你可以执行一个简单的Lua脚本来实现原子性的批量删除。

EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 'your_pattern*'
  • 这个脚本先执行 KEYS 命令获取所有匹配的键,然后通过 del 命令一次性删除。
  • 注意点4:这种方法虽然写起来简单,但它内部仍然使用了阻塞性的 KEYS 命令,所以它同样有导致服务暂停的风险。只适用于键数量非常少或者可以确认是离线维护的场景,绝对不推荐在生产环境大量数据下使用。

第四步:确认删除结果

删除完成后,最好再次使用 KEYS 命令(谨慎!)或者 DBSIZE 命令检查一下。DBSIZE 可以快速返回当前数据库的键总数,通过删除前后的数量对比,可以大致判断删除是否成功。

DBSIZE

最重要的注意点总结:

  1. 备份!备份!备份!:在执行任何批量删除操作前,如果数据重要,务必使用 BGSAVE 命令对Redis进行持久化备份,这是你的“后悔药”。
  2. 环境确认:再三确认你连接的是远程测试环境还是生产环境,最好通过命令(如 INFO server 查看服务器信息)二次确认,避免误删生产数据库。
  3. 避免使用阻塞命令:生产环境批量操作,优先选择 redis-cli --scan 的方式,坚决避免直接使用 KEYS 命令或在Lua脚本中使用 KEYS
  4. 权限最小化:用于远程连接的这个账号,最好只被授予执行必要命令(如 scan, del)的权限,而不是最高权限,降低误操作风险。
  5. 分批操作:如果待删除的数据量极其巨大,可以考虑对键模式进行更精细的划分,分多次、小批量删除,进一步降低对服务的影响。
  6. 通知与监控:操作前通知相关业务方,操作中密切监控Redis服务器的CPU、内存和延迟等指标,一旦有异常立刻停止。

就是远程批量删除Redis数据的核心步骤和必须牢记的注意点,核心思想就是:谨慎连接、精确定位、选择非阻塞方式删除、并做好万全的备份和监控。

用Redis远程怎么批量删数据,操作步骤和注意点分享