浅谈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 24 Redis
redis三种高可用方式部署的实现
May 11 Redis
浅谈redis缓存在项目中的使用
May 20 Redis
redis哨兵常用命令和监控示例详解
May 27 Redis
详解Redis集群搭建的三种方式
May 31 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
Redis Stream类型的使用详解
Nov 11 Redis
关于使用Redisson订阅数问题
Jan 18 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
redis 解决库存并发问题实现数量控制
Apr 08 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 SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
php实现映射操作实例详解
2019/10/02 PHP
php实现JWT验证的实例教程
2020/11/26 PHP
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
js判断日期时间有效性的方法
2015/10/24 Javascript
js实现跨域的4种实用方法原理分析
2015/10/29 Javascript
JavaScript jquery及AJAX小结
2016/01/24 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理
2016/05/12 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
python执行使用shell命令方法分享
2017/11/08 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
AOP的定义以及作用
2013/09/08 面试题
会计毕业生求职简历的自我评价
2013/10/20 职场文书
仓管员岗位责任制
2014/02/19 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
个人年终总结怎么写
2015/03/09 职场文书
技能培训通讯稿
2015/07/18 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
使用Django实现商城验证码模块的方法
2021/06/01 Python
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫