问题背景:由于线上系统功能卡顿,接口调用卡顿长达数分钟,经过排查发现是缓存未设置过期时间过多导致redis数据量达到百万级。需要批量删除key

Redis 中有删除单个Key的指令 DEL,但好像没有批量删除Key的指令,不过我们可以借助Linux的xargs指令来完成这个动作。

过程:redis部署安装在Linux的docker环境中,
1.登录Linux找到对应的doker容器,进入到bin/bash界面。

docker exec -it redis /bin/bash


2.进入到redis-cli的目录下,执行如下命令:

redis-cli -n 0 -p 6379 -a root scan 0 match '11*' count 2 |xargs redis-cli -n 0 -p 6379 -a root del

redis window批量删除 redis del批量删除_批量删除


批量删除前:

redis window批量删除 redis del批量删除_redis window批量删除_02


批量删除:

redis window批量删除 redis del批量删除_redis_03


批量删除后:

redis window批量删除 redis del批量删除_linux_04

参数讲解:
redis-cli -n 0 -p 6379 -a root --scan 0 --pattern '1’ count 10 | xargs redis-cli -n 0 -p 6379 -a root del*
-n : 后面跟的是数据库,具体哪个数据库。
-p : 后面跟的是端口
-a: 后面跟的是登陆密码
–scan 后面跟的数量值是游标值
–pattern 表示以某种规则进行迭代扫描,这里 1* 表示以 1 开头的key。
–count 后面跟的是要删除的数量
| xargs 表示可以把前面得到的所有key,传递到后面那句的参数里
遇到的问题:

禁止使用

redis-cli -n 0 -p 6379 -a root keys '1’ count 2 |xargs redis-cli -n 0 -p 6379 -a root del* 命令


因为KEYS或者SMEMBERS在针对大型集合调用时可能会阻塞服务器很长时间(甚至几秒钟)键或元素。
但 SCAN 命令系列仅对返回的元素提供有限的保证,因为我们增量迭代的集合在迭代过程中可能会发生变化。