浅谈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 11 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
Redis性能监控的实现
Jul 09 Redis
Redis Stream类型的使用详解
Nov 11 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Mar 17 Redis
redis数据结构之压缩列表
Mar 21 Redis
使用Redis做预定库存缓存功能
Apr 02 Redis
Redis中key的过期删除策略和内存淘汰机制
Apr 12 Redis
浅谈Redis变慢的原因及排查方法
Jun 21 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 MYSQL中插入当前时间
2008/04/06 PHP
zend framework多模块多布局配置
2011/02/26 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
用php代码限制国内IP访问我们网站
2015/09/26 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
PHP图片裁剪与缩放示例(无损裁剪图片)
2017/02/08 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
PHP实现打包下载文件的方法示例
2017/10/07 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
text-align:justify实现文本两端对齐 兼容IE
2015/08/19 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
简单理解vue中Props属性
2016/10/27 Javascript
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
2018/12/06 NodeJs
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
安装python及pycharm的教程图解
2019/10/10 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
世界领先的高品质定制产品平台:Zazzle
2017/07/23 全球购物
文化与传播毕业生求职信
2014/03/09 职场文书
员工辞退通知书
2015/04/17 职场文书
就业证明函
2015/06/17 职场文书
校运会加油稿大全
2015/07/22 职场文书
[有人@你]你有一封绿色倡议书,请查收!
2019/07/18 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python