浅谈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 12 Redis
浅谈redis五大数据结构和使用场景
Apr 12 Redis
Redis遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 Redis
Redis持久化与主从复制的实践
Apr 27 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
SpringBoot整合Redis入门之缓存数据的方法
Nov 17 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
Redis中有序集合的内部实现方式的详细介绍
Mar 16 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
vue-cli 3.x 配置Axios(proxyTable)跨域代理方法
2018/09/19 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
Python二分法搜索算法实例分析
2015/05/11 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
Python跳出多重循环的方法示例
2019/07/03 Python
Django 限制访问频率的思路详解
2019/12/24 Python
详解移动端h5页面根据屏幕适配的四种方案
2020/04/15 HTML / CSS
Clarins娇韵诗英国官网:来自法国的天然护肤品牌
2017/04/18 全球购物
读书之星事迹材料
2014/05/12 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
考博导师推荐信范文
2015/03/27 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
大学生十八大感想
2015/08/11 职场文书
2019年暑期安全广播稿!
2019/07/03 职场文书
导游词之西安骊山
2019/12/03 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android