redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 KEYS "websocket127.0.0.1:5*" | xargs redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 DEL
Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。
注:这个指令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点。
所以建议生产环境屏蔽keys命令
scan 相比 keys 具备有以下特点:
KEYS vs SCAN
一樣都會掃過所有的 key,scan 不會阻塞整個 server,而是迭代的收集結果
DEL vs UNLINK
一樣都是刪除 key ,差別在於 unlink 是非阻塞的刪除,會以非同步的方式回收記憶體
所以对于一个大的key数量,我们可以借助sscan使用下边的命令可以实现优雅的批量删除:
redis-cli -h 172.18.255.99 -p 6379 --scan --pattern users:* | xargs redis-cli -h 172.18.255.99 -p 6379 unlink
(error) ERR unknown command 'unlink'
如果出现以上错误,说明redis版本不足,使用unlink需要Redis4版本
cluster 删除数据
redis-cli -c -p 7000 --scan --pattern "age_*" | xargs -L 1 redis-cli -c -p 7000 -n 0 unlink
遍历redis cluster各分片删除
for port in {7000..7005}; do redis-cli -c -p ${port} -h 192.168.31.181 --scan --pattern "age_*" | xargs -L 1 redis-cli -h 192.168.31.181 -c -p ${port} -n 0 unlink done
func DeleteRedisKeys(key string) { traceId := libra.GenTraceId(context.Background(), nil) ctx := libra.SetTraceId(context.Background(), traceId) //模糊查询所有符合条件的key websocketKeys, _ := commons.GetRedisClient().Keys(ctx, key+"*").Result() if reflect.TypeOf(websocketKeys).Kind() == reflect.Slice { val := reflect.ValueOf(websocketKeys) if val.Len() == 0 { return } // 批量删除key for i := 0; i < val.Len(); i++ { _, err := commons.GetRedisClient().Del(ctx, val.Index(i).Interface().(string)).Result() dlog.Errorf("DeleteKeys addr:=%v,err=%v", addr, err) } } }
参考文档:
Redis SCAN的使用:http://jinguoxing.github.io/redis/2018/09/04/redis-scan/