浅谈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遍历所有key的两个命令(KEYS 和 SCAN)
Apr 12 Redis
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
redis 限制内存使用大小的实现
May 08 Redis
解析Redis Cluster原理
Jun 21 Redis
使用Redis实现实时排行榜功能
Jul 02 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
基于Redis6.2.6版本部署Redis Cluster集群的问题
Apr 01 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis keys命令的具体使用
Jun 05 Redis
Redis+AOP+自定义注解实现限流
Jun 28 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
Protoss兵种介绍
2020/03/14 星际争霸
用libTemplate实现静态网页的生成
2006/10/09 PHP
php后台多用户权限组思路与实现程序代码分享
2012/02/13 PHP
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
php格式化日期实例分析
2014/11/12 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
javascript call方法使用说明
2010/01/11 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
jquery dialog open后,服务器端控件失效的快速解决方法
2013/12/19 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
jquery实现数字输入框
2017/02/22 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
解决Layui 表格自适应高度的问题
2019/11/15 Javascript
vue中touch和click共存的解决方式
2020/07/28 Javascript
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
Python中super函数的用法
2017/11/17 Python
Pycharm+Scrapy安装并且初始化项目的方法
2019/01/15 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
美国医生配方营养补充剂供应商:Healthy Directions
2019/07/10 全球购物
Android面试题附答案
2014/12/08 面试题
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
班训口号大全
2014/06/18 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
春秋淹城导游词
2015/02/11 职场文书
2015年学校党支部工作总结
2015/04/01 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
创业计划书之养殖业
2019/10/11 职场文书
python文件目录操作之os模块
2021/05/08 Python
Python中第三方库Faker的使用详解
2022/04/02 Python