浅谈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持久化与主从复制的实践
Apr 27 Redis
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
redis 限制内存使用大小的实现
May 08 Redis
redis实现的四种常见限流策略
Jun 18 Redis
浅析Redis Sentinel 与 Redis Cluster
Jun 24 Redis
浅谈redis整数集为什么不能降级
Jul 25 Redis
Redis入门教程详解
Aug 30 Redis
详解Redis在SpringBoot工程中的综合应用
Oct 16 Redis
分布式架构Redis中有哪些数据结构及底层实现原理
Mar 13 Redis
redis击穿 雪崩 穿透超详细解决方案梳理
Mar 17 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis唯一ID生成器的实现
Jul 07 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数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
js实现数组去重、判断数组以及对象中的内容是否相同
2013/11/29 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
解决vue-cli单页面手机应用input点击手机端虚拟键盘弹出盖住input问题
2018/08/25 Javascript
vue移动端弹起蒙层滑动禁止底部滑动操作
2020/07/22 Javascript
Python用Bottle轻量级框架进行Web开发
2016/06/08 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Python 使用type来定义类的实现
2019/11/19 Python
python类中super() 的使用解析
2019/12/19 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
2020/02/04 Python
python3连接MySQL8.0的两种方式
2020/02/17 Python
python实现四人制扑克牌游戏
2020/04/22 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
NFL Game Pass欧洲:在线观看NFL比赛直播和点播,以高清质量播放
2018/08/30 全球购物
大学生毕业自我评价范文分享
2013/11/11 职场文书
教师自我鉴定
2013/12/13 职场文书
草船借箭教学反思
2014/02/03 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
公证委托书格式
2014/09/13 职场文书
大学生实训报告总结
2014/11/05 职场文书
初婚初育证明范本
2014/11/24 职场文书
工作检讨书大全
2015/01/26 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技