浅谈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 key命令key的储存方式

    Redis key命令key的储存方式

    这篇文章主要介绍了Redis key命令key的储存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 压缩列表牺牲速度来节省内存,Redis是膨胀了吗

    压缩列表牺牲速度来节省内存,Redis是膨胀了吗

    这篇文章主要给大家解释了Redis 当中的 ziplist(压缩列表)牺牲速度来节省内存的原因,希望大家能够喜欢
    2021-02-02
  • Redis键值设计的具体实现

    Redis键值设计的具体实现

    本文主要介绍了Redis键值设计的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • redis key键过期删除策略及淘汰机制探究

    redis key键过期删除策略及淘汰机制探究

    这篇文章主要为大家介绍了redis key键过期删除策略及淘汰机制探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Redis fork进程分配不到内存解决方案

    Redis fork进程分配不到内存解决方案

    这篇文章主要介绍了Redis fork进程分配不到内存解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Redis数据库安全详解

    Redis数据库安全详解

    这篇文章主要为大家介绍了Redis数据库安全详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • 详解redis分布式锁(优化redis分布式锁的过程及Redisson使用)

    详解redis分布式锁(优化redis分布式锁的过程及Redisson使用)

    在分布式的开发中,以电商库存的更新功能进行讲解,在实际的应用中相同功能的消费者是有多个的,这篇文章主要介绍了redis分布式锁详解(优化redis分布式锁的过程及Redisson使用),需要的朋友可以参考下
    2021-11-11
  • Redis如何使用HyperLogLog的实现

    Redis如何使用HyperLogLog的实现

    本文主要介绍了Redis如何使用HyperLogLog的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Redis数据类型之散列类型hash命令学习

    Redis数据类型之散列类型hash命令学习

    这篇文章主要为大家介绍了Redis数据类型之散列类型hash命令学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • redis主从复制原理的深入讲解

    redis主从复制原理的深入讲解

    这篇文章主要给大家介绍了关于redis主从复制原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论