浅谈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 sentinel 频繁主备切换的问题
Apr 12 Redis
浅谈Redis存储数据类型及存取值方法
May 08 Redis
redis 限制内存使用大小的实现
May 08 Redis
浅谈Redis主从复制以及主从复制原理
May 29 Redis
springboot使用Redis作缓存使用入门教程
Jul 25 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
使用redis实现延迟通知功能(Redis过期键通知)
Sep 04 Redis
为什么RedisCluster设计成16384个槽
Sep 25 Redis
分布式架构Redis中有哪些数据结构及底层实现原理
Mar 13 Redis
Redis分布式锁的7种实现
Apr 01 Redis
浅谈Redis 中的过期删除策略和内存淘汰机制
Apr 03 Redis
Redis实现短信验证码登录的示例代码
Jun 14 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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
php数组遍历类与用法示例
2019/05/24 PHP
JavaScript 继承详解(一)
2009/07/13 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
js重写方法的简单实现
2016/07/10 Javascript
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
vue-baidu-map 进入页面自动定位的解决方案(推荐)
2018/04/28 Javascript
JavaScript 中的无穷数(Infinity)详解
2020/02/13 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
2020/09/29 Javascript
[01:35]辉夜杯战队访谈宣传片—iG.V
2015/12/25 DOTA
python缩进区别分析
2014/02/15 Python
python使用fileinput模块实现逐行读取文件的方法
2015/04/29 Python
用Python解决计数原理问题的方法
2016/08/04 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
django 将model转换为字典的方法示例
2018/10/16 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
过滤器的用法
2013/10/08 面试题
大学自主招生自荐信范文
2014/02/26 职场文书
2014年安全生产责任书
2014/07/22 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
老干部工作汇报材料
2014/10/28 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
Python中的np.argmin()和np.argmax()函数用法
2021/06/02 Python
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android