浅谈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实现分布式锁的方法(lua脚本版)
May 12 Redis
深入浅析Redis 集群伸缩原理
May 15 Redis
浅谈Redis的几个过期策略
May 27 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
解析高可用Redis服务架构分析与搭建方案
Jun 20 Redis
redis cluster支持pipeline的实现思路
Jun 23 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
Redis 限流器
May 15 Redis
Redis配置外网可访问(redis远程连接不上)的方法
Dec 24 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下通过POST还是GET来传值
2008/06/05 PHP
php错误级别的设置方法
2013/06/17 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
javascript 面向对象继承
2009/11/26 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
vue 项目引入echarts 添加点击事件操作
2020/09/09 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
Python urlopen()函数 示例分享
2014/06/12 Python
使用python 3实现发送邮件功能
2018/06/15 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
2016/12/20 HTML / CSS
易程科技软件测试笔试
2013/03/24 面试题
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
教育局长自荐信范文
2013/12/22 职场文书
中学教师培训制度
2014/01/31 职场文书
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
婚庆司仪开场白
2015/05/29 职场文书
Anaconda配置各版本Pytorch的实现
2021/08/07 Python