浅谈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的几个过期策略
May 27 Redis
Redis可视化客户端小结
Jun 10 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
Redis三种集群模式详解
Oct 05 Redis
Redis的字符串是如何实现的
Oct 24 Redis
Redis 异步机制
May 15 Redis
Redis基本数据类型Zset有序集合常用操作
Jun 01 Redis
Redis实现主从复制方式(Master&Slave)
Jun 21 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代码
2010/07/17 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
jQuery的animate函数学习记录
2014/08/08 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
jQuery层级选择器用法分析
2015/02/10 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
Javascript编程之继承实例汇总
2015/11/28 Javascript
Angular 4 依赖注入学习教程之FactoryProvider的使用(四)
2017/06/04 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
angular.js4使用 RxJS 处理多个 Http 请求
2017/09/23 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
其实你可以少写点if else与switch(推荐)
2019/01/10 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
python将ansible配置转为json格式实例代码
2017/05/15 Python
Python从文件中读取数据的方法讲解
2019/02/14 Python
使用python实现简单五子棋游戏
2019/06/18 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
python图片二值化提高识别率代码实例
2019/08/24 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
完美解决ARIMA模型中plot_acf画不出图的问题
2020/06/04 Python
Python接口自动化测试的实现
2020/08/28 Python
纯CSS3实现鼠标滑过按钮动画第二节
2020/07/16 HTML / CSS
银河香水:Galaxy Perfume
2019/03/25 全球购物
网络专业学生个人的自我评价
2013/12/16 职场文书
教育基金募捐倡议书
2014/05/14 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
初中英语教师个人工作总结2015
2015/07/21 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android