浅谈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 19 Redis
嵌入式Redis服务器在Spring Boot测试中的使用教程
Jul 21 Redis
浅谈redis整数集为什么不能降级
Jul 25 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
Redis字典实现、Hash键冲突及渐进式rehash详解
Sep 04 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
Feb 12 Redis
Redis中有序集合的内部实现方式的详细介绍
Mar 16 Redis
一文搞懂Redis中String数据类型
Apr 03 Redis
Redis特殊数据类型HyperLogLog基数统计算法讲解
Jun 01 Redis
Redis基本数据类型List常用操作命令
Jun 01 Redis
浅谈Redis缓冲区机制
Jun 05 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环境无法上传文件的解决方法
2014/04/30 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
php文件上传类完整实例
2016/05/14 PHP
PHP实现上一篇下一篇的方法实例总结
2016/09/22 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
vue+axios实现登录拦截的实例代码
2017/05/22 Javascript
基于javaScript的this指向总结
2017/07/22 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
微信小程序页面调用自定义组件内的事件详解
2019/09/12 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
JavaScript实现打字游戏
2021/02/19 Javascript
Python中用altzone()方法处理时区的教程
2015/05/22 Python
python正则分析nginx的访问日志
2017/01/17 Python
对django中render()与render_to_response()的区别详解
2018/10/16 Python
python实现自动获取IP并发送到邮箱
2018/12/26 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
匡威英国官网:Converse英国
2018/12/02 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
学生就业推荐信
2013/11/13 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
三严三实对照检查材料
2014/08/25 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS