浅谈Redis的keys命令到底有多慢


Posted in Redis onOctober 05, 2021

keys命令的用法:

keys pattern

查找符合正则匹配的key的列表。扫描对象是Redis服务中所有的key,想想都很慢对不对?
同时执行keys命令的同时,Redis进程将被阻塞,无法执行其他命令,假如超过了哨兵的down-after-milliseconds配置,还会进行主从切换,切换过程中,如果主节点恢复正常,还可能出现脑裂等一系列问题。

所以,生产环境中,建议直接禁用keys命令。

Keys命令的替代方案

1、scan扫描,避免阻塞
2、将需要统计的数据放入一个set中 (但是这样可能出现Big Key问题,一般数据量大就不推荐)

Keys命令在Redis Cluster中是怎样执行的?

一般来说,keys命令对于集群节点来说,是不知道路由到哪个节点的,不像 get命令。在Java的Jedis客户端的JedisClusterKeyCommands类中,我们看到:

public Set<byte[]> keys(byte[] pattern) {
		// 在每个节点执行keys命令
		Collection<Set<byte[]>> keysPerNode = connection.getClusterCommandExecutor()
				.executeCommandOnAllNodes((JedisClusterCommandCallback<Set<byte[]>>) client -> client.keys(pattern))
				.resultsAsList();
		// 合并成一个整体后返回
		Set<byte[]> keys = new HashSet<>();
		for (Set<byte[]> keySet : keysPerNode) {
			keys.addAll(keySet);
		}
		return keys;
	}

我们看到,Jedis是通过在每个节点上执行keys命令,并将结果合并返回的。

本文既然将keys命令的慢,那么他到底有多慢呢?

Keys命令到底有多慢?

这里主要是给大家一个基本的概念,并不是深入剖析。

浅谈Redis的keys命令到底有多慢

这是腾讯云上Redis集群服务中,慢查询的日志。我们看到,Keys命令大概执行了250ms ~ 300ms。

浅谈Redis的keys命令到底有多慢

根据节点信息,我们看到,每个节点存储了大约153w的key,占用内存300M+,平均每个键值对占用内存0.208KB,合213个字节

根据我的理解,既然keys命令返回的是key值,而集群中其实有一个结构slots_to_keys 记录着所有key 的, 这只与key的数量有关,与Big key的关系不大。

按照这种猜想,假如此时Redis节点占用内存为3G,且Key数量成比例,那么Keys命令执行时间因为3s左右,这段时间Redis节点是阻塞的。

到此这篇关于浅谈Redis的keys命令到底有多慢的文章就介绍到这了,更多相关Redis keys命令内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
基于Redis过期事件实现订单超时取消
May 08 Redis
Redis高级数据类型Hyperloglog、Bitmap的使用
May 24 Redis
详解缓存穿透击穿雪崩解决方案
May 28 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
解析redis hash应用场景和常用命令
Aug 04 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
面试分析分布式架构Redis热点key大Value解决方案
Mar 13 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Redis+AOP+自定义注解实现限流
Jun 28 Redis
Redis唯一ID生成器的实现
Jul 07 Redis
基于Redis结合SpringBoot的秒杀案例详解
Jedis操作Redis实现模拟验证码发送功能
Sep 25 #Redis
为什么RedisCluster设计成16384个槽
使用redis生成唯一编号及原理示例详解
Sep 15 #Redis
Redis读写分离搭建的完整步骤
Sep 14 #Redis
在项目中使用redis做缓存的一些思路
Redis RDB技术底层原理详解
Sep 04 #Redis
You might like
php实现将上传word文件转为html的方法
2015/06/03 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JavaScript中扩展Array contains方法实例
2020/08/23 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
使用jQuery和ajax代替iframe的方法(详解)
2017/04/12 jQuery
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
Vue项目打包压缩的实现(让页面更快响应)
2020/03/10 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
python插入排序算法的实现代码
2013/11/21 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
如何利用python查找电脑文件
2018/04/27 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
python解决字符串倒序输出的问题
2018/06/25 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
python代码编写计算器小程序
2020/03/30 Python
python 怎样进行内存管理
2020/11/10 Python
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
安全生产检查通报
2014/01/29 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python