浅谈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 相关文章推荐
详解缓存穿透击穿雪崩解决方案
May 28 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
Redis 常见使用场景
Aug 30 Redis
使用redis实现延迟通知功能(Redis过期键通知)
Sep 04 Redis
Redis RDB技术底层原理详解
Sep 04 Redis
Redis+Lua脚本实现计数器接口防刷功能(升级版)
Feb 12 Redis
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 Redis
redis调用二维码时的不断刷新排查分析
Apr 01 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
Redis实现短信验证码登录的示例代码
Jun 14 Redis
Redis Lua脚本实现ip限流示例
Jul 15 Redis
基于Redission的分布式锁实战
Aug 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
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
用JS实现一个页面多个css样式实现
2008/05/29 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
基于javascript实现日历功能原理及代码实例
2020/05/07 Javascript
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
pycharm运行scrapy过程图解
2019/11/22 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
"引用"与多态的关系
2013/02/01 面试题
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
初中数学教学反思
2014/01/16 职场文书
珍惜水资源建议书
2014/03/12 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
银行党员批评与自我批评
2014/10/15 职场文书
领导干部失职检讨书
2015/05/05 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android