浅谈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 27 Redis
为Java项目添加Redis缓存的方法
May 18 Redis
redis实现排行榜功能
May 24 Redis
redis不能访问本机真实ip地址的解决方案
Jul 07 Redis
基于Redis的List实现特价商品列表功能
Aug 30 Redis
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
Feb 12 Redis
Redis命令处理过程源码解析
Feb 12 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis特殊数据类型Geospatial地理空间
Jun 01 Redis
Redis全局ID生成器的实现
Jun 05 Redis
基于redis+lua进行限流的方法
Jul 23 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
Windows下的PHP5.0详解
2006/11/18 PHP
深入php处理整数函数的详解
2013/06/09 PHP
ThinkPHP之A方法实例讲解
2014/06/20 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
javascript中神奇的 Date对象小结
2017/10/12 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
Python批量按比例缩小图片脚本分享
2015/05/21 Python
python实现Windows电脑定时关机
2018/06/20 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
python 导入数据及作图的实现
2019/12/03 Python
Django数据库操作之save与update的使用
2020/04/01 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
美国男士和女士奢侈品折扣手表购物网站:Certified Watch Store
2018/06/13 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
总经理岗位职责说明书
2014/07/30 职场文书
我的中国梦演讲稿500字
2014/08/19 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
教师节表彰会主持词
2015/07/06 职场文书
学校安全管理制度
2015/08/06 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL