Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > redis模糊删除key

redis模糊批量删除key的方法

作者:杰哥的技术杂货铺

这篇文章主要介绍了redis模糊批量清除key的操作方法,包括命令行删除和golang代码删除,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、命令行删除

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

二、golang代码删除

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/

到此这篇关于redis模糊批量清除key的文章就介绍到这了,更多相关redis模糊删除key内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文