浅谈Redis的keys命令到底有多慢

 更新时间:2021年10月01日 08:44:37   作者:c&0xff00  
本文主要介绍了浅谈Redis的keys命令到底有多慢,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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命令大概执行了250ms ~ 300ms。


根据节点信息,我们看到,每个节点存储了大约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唯一ID生成器的实现

    Redis唯一ID生成器的实现

    本文主要介绍了Redis唯一ID生成器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • RedisTemplate 实现基于Value 操作的简易锁机制(示例代码)

    RedisTemplate 实现基于Value 操作的简易锁机制(示例代码)

    本文将介绍如何使用 RedisTemplate 的 opsForValue().setIfAbsent() 方法来实现一种简单的锁机制,并提供一个示例代码,展示如何在 Java 应用中利用这一机制来保护共享资源的访问,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • redis基本安装判断、启动使用方法示例

    redis基本安装判断、启动使用方法示例

    这篇文章主要介绍了redis基本安装判断、启动使用方法,结合实例形式分析了Redis针对是否安装的判断、启动等使用方法,需要的朋友可以参考下
    2020-02-02
  • redis集群实现清理前缀相同的key

    redis集群实现清理前缀相同的key

    这篇文章主要介绍了redis集群实现清理前缀相同的key,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • redis客户端实现高可用读写分离的方式详解

    redis客户端实现高可用读写分离的方式详解

    基于sentienl 获取和动态感知 master、slaves节点信息的变化,我们的读写分离客户端就能具备高可用+动态扩容感知能力了,接下来通过本文给大家分享redis客户端实现高可用读写分离的方式,感兴趣的朋友一起看看吧
    2021-07-07
  • Redis实现好友关注的示例代码

    Redis实现好友关注的示例代码

    本文主要介绍了Redis实现好友关注的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • 浅谈Redis哨兵模式高可用解决方案

    浅谈Redis哨兵模式高可用解决方案

    Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务,感兴趣的可以了解一下
    2022-03-03
  • redis批量删除指定前缀key四种方法(收藏)

    redis批量删除指定前缀key四种方法(收藏)

    这篇文章主要介绍了redis批量删除指定前缀key四种方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-03-03
  • Redis中哈希分布不均匀的解决办法

    Redis中哈希分布不均匀的解决办法

    这篇文章主要介绍了Redis中哈希分布不均匀的解决办法的相关资料,需要的朋友可以参考下
    2021-02-02
  • Redis使用bloom-filter过滤器实现推荐去重

    Redis使用bloom-filter过滤器实现推荐去重

    这篇文章主要介绍了Redis使用bloom-filter过滤器实现推荐去重,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论