Redis 的 keys 命令你知道有多慢吗?

简介: Redis 的 keys 命令你知道有多慢吗?

keys命令的用法:


keys pattern

查找符合正则匹配的key的列表。扫描对象是Redis服务中所有的key,想想都很慢对不对?


同时执行keys命令的同时,Redis进程将被阻塞,无法执行其他命令,假如超过了哨兵的down-after-milliseconds配置,还会进行主从切换,切换过程中,如果主节点恢复正常,还可能出现脑裂等一系列问题。


所以,生产环境中,建议直接禁用keys命令。


Keys命令的替代方案

  • scan扫描,避免阻塞
  • 将需要统计的数据放入一个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命令到底有多慢?

这里主要是给大家一个基本的概念,并不是深入剖析。


image.png


这是腾讯云上Redis集群服务中,慢查询的日志。我们看到,Keys命令大概执行了250ms ~ 300ms。

image.png



根据节点信息,我们看到,每个节点存储了大约153w的key,占用内存300M+,平均每个键值对占用内存0.208KB,合213个字节。


根据我的理解,既然keys命令返回的是key值,而集群中其实有一个结构slots_to_keys 记录着所有key 的, 这只与key的数量有关,与Big key的关系不大。


按照这种猜想,假如此时Redis节点占用内存为3G,且Key数量成比例,那么Keys命令执行时间因为3s左右,这段时间Redis节点是阻塞的。


原文链接:https://blog.csdn.net/weixin_37968613/article/details/119065777

相关文章
|
Java API Nacos
OpenFeign与Nacos结合使用时获取服务提供者的真实IP地址的方法
最终,当服务调用一次次执行,数据一次次精准传递时,这个寻找真实IP地址的宝藏狩猎,就顺利完成了。这不单单是原创性的解决方案,更是创意性地结合了现代微服务技术,和你一起编织了这场寻宝之旅的冒险故事。
549 25
|
存储 监控 关系型数据库
关系型数据库mysql的BLACKHOLE
【6月更文挑战第18天】
601 4
|
负载均衡 前端开发 Java
第六章 Spring Cloud 之 OpenFeign
第六章 Spring Cloud 之 OpenFeign
554 0
|
负载均衡 Java Nacos
SpringCloud微服务之微服务SpringCloud实用篇02
SpringCloud微服务之微服务SpringCloud实用篇02
1308 0
|
SpringCloudAlibaba Java Nacos
Nacos Config的多环境(Profile)配置信息读取
读取`Profile`多环境下`Nacos Config`的配置信息,了解多环境下相同的配置优先级加载问题。
|
存储 运维 负载均衡
Redis Cluster集群原理+三主三从交叉复制实战+故障切换(十)
Redis Cluster集群原理+实战+故障切换 文章目录 Redis Cluster集群原理+实战+故障切换 1.redis cluster原理概念 1.1.cluster架构概念 1.2.redis cluster不合理的架构图 1.3.部署一个cluster三主三从集群具体步骤 1.4.环境准备 2.部署redis cluster节点 2.1.redis-1配置 2.2.redis-2配置 2.3.redis-3配置 2.4.查看redis cluster进程 2.5.查看集群信息文件内容 3.配置cluster集群互相发现 3.1.互相发现概念 3.2.将集群的所有节点进行互相发现
5719 0
Redis Cluster集群原理+三主三从交叉复制实战+故障切换(十)
|
存储 算法 数据安全/隐私保护
|
存储 关系型数据库 MySQL
详解 Mysql 分布式事务 XA(跨数据库事务)
详解 Mysql 分布式事务 XA(跨数据库事务)
|
网络协议 前端开发 Java
【剖析 | SOFARPC 框架】之SOFARPC 连接管理与心跳剖析
本文介绍连接管理的策略和SOFARPC中连接管理与心跳机制的实现,希望通过这篇文章,大家对此有一个了解,如果对其中有疑问的,也欢迎留言与我们讨论。
2123 0
|
Unix Linux
Linux 查看crontab日志
在Unix和类Unix的操作系统之中,crontab命令常用于设置周期性被执行的指令,也可以理解为设置定时任务。 crontab中的定时任务有时候没有成功执行,什么原因呢?这时就需要去日志里去分析一下了,那该如何查看crontab的日志记录呢? 1.
2934 0