我的编程空间,编程开发者的网络收藏夹
学习永远不晚

redis模糊批量删除key的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

redis模糊批量删除key的方法

一、命令行删除

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
  • -h:redis地址
  • -p:redis端口
  • -n:reids库
  • -a:redis密码

Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。

注:这个指令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点。

  • 没有 offset、limit 参数,一次性吐出所有满足条件的 key,万一实例中有几百 w 个 key 满足条件,
  • 当你看到满屏的字符串刷的没有尽头时,你就知道难受了。
  • keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿,
  • 所有读写 Redis 的其它的指令都会被延后甚至会超时报错,
  • 因为 Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续。

所以建议生产环境屏蔽keys命令

scan 相比 keys 具备有以下特点:

  • 复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;
  • 提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是对增量式迭代命令的一种提示(hint),返回的结果可多可少;
  • 同 keys 一样,它也提供模式匹配功能;
  • 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
  • 返回的结果可能会有重复,需要客户端去重复,这点非常重要;
  • 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;
  • 单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零

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
  • 用 scan 找出要刪的 key
  • 透過 xargs 傳給 unlink 刪掉 key
(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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

redis模糊批量删除key的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis模糊批量删除key的方法

目录一、命令行删除二、golang代码删除一、命令行删除Redis-cli -h 172.18.255.99http://www.cppcns.com -p 6379 -n 6 -a 123456 KEYS "websocket127.0
2022-12-16

Redis批量删除KEY的方法

Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作。redis-cli keys “*” | xargs redis-cli del //如
2022-06-04

Redis如何批量删除指定模糊的key举例

目录一、批量删除指定模糊的key二、SCAN命令逐步遍历数据总结一、批量删除指定模糊的key批量删除前,可以查询要删除的key进行确认,keys 指令可以进行模糊匹TfxPjTFH配:Redis-cli keys "my*www.lsj
Redis如何批量删除指定模糊的key举例
2024-08-17

Redis批量删除Key的方式有哪些

本文小编为大家详细介绍“Redis批量删除Key的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis批量删除Key的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一.使用命令行批量删除
2023-07-06

Redis批量删除Key的三种方式小结

目录一.使用命令行批量删除Redis的key二.使用图形界面工具RedisDesktopManager三.使用jedis批量删除keysRedis 中有删除单个 Key 的指令 del,但好像没有批量删除 Key 的指令,不过我们可以借助
2023-04-10

Redis批量删除key的命令详解

Redis中没有直接根据正则表达式删除key的命令,只有dejsl key1 key2...命令但是redis中有通过正则表达式获编程客栈取key的命令:keys "正则表达式"可以借助于xargs命令实现批量删除key,把查出来的ke
2023-03-23

redis中怎么批量删除指定key

在Redis中,可以使用DEL命令批量删除指定的key。DEL命令可以同时删除一个或多个key,只要将需要删除的key作为参数传递给DEL命令即可。例如,如果要删除key1、key2和key3,可以使用以下命令:DEL key1 key2
2023-09-06

Redis批量删除key的命令怎么使用

这篇文章主要介绍了Redis批量删除key的命令怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis批量删除key的命令怎么使用文章都会有所收获,下面我们一起来看看吧。redis中没有直接根据正则表
2023-07-05

redis的批量删除方法是什么

Redis的批量删除方法可以使用DEL命令进行操作。DEL命令用于删除一个或多个指定的键(key)。它可以一次删除一个或多个键,可以同时删除不同类型的键。使用语法:DEL key [key ...]示例:DEL key1 key2 key3
2023-09-11

redis批量删除key值的问题怎么解决

这篇文章主要讲解了“redis批量删除key值的问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis批量删除key值的问题怎么解决”吧!遇到的问题:在开发过程中,会遇到要批量
2023-06-29

redis批量获取key的方法是什么

Redis没有提供原生的批量获取key的方法。但是可以使用MGET命令来批量获取多个key的值,然后根据返回的结果来获取对应的key。例如:MGET key1 key2 key3这样就可以一次性获取key1、key2、key3对应的值。如
redis批量获取key的方法是什么
2024-04-09

sql批量模糊查询的方法是什么

在SQL中,批量模糊查询可以通过使用通配符和IN子句来实现。以下是一种常见的方法:1. 使用通配符进行模糊查询:通配符是用来匹配搜索模式中的字符的特殊字符。在SQL中,常用的通配符有百分号(%)和下划线(_)。- 百分号(%)表示任意长度的
2023-08-24

编程热搜

目录