浅谈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 sort 排序命令详解

    Redis sort 排序命令详解

    这篇文章主要介绍了Redis sort 排序命令详解,本文讲解了默认排序命令、排序方式命令、BY语法、GET用法示例等内容,需要的朋友可以参考下
    2015-07-07
  • 编译安装redisd的方法示例详解

    编译安装redisd的方法示例详解

    这篇文章主要介绍了编译安装redisd的方法示例详解,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Redis GEO地理信息定位功能

    Redis GEO地理信息定位功能

    Redis 提供了GEO地理信息定位功能,地理空间项(经度、纬度、名称),实现查找附近的人、上班打卡、自行车租赁、摇一摇等相关与地理位置信息的功能,这篇文章主要介绍了Redis GEO地理信息定位功能,需要的朋友可以参考下
    2023-12-12
  • 使用redis获取自增序列号实现方式

    使用redis获取自增序列号实现方式

    这篇文章主要介绍了使用redis获取自增序列号实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Redis线程模型的原理分析

    Redis线程模型的原理分析

    Redis是一个高性能的数据存储框架,在高并发的系统设计中,Redis也是一个比较关键的组件,是我们提升系统性能的一大利器,本文详细的介绍了Redis线程模型,感兴趣的可以了解一
    2021-11-11
  • Quarkus集成redis操作Redisson实现数据互通

    Quarkus集成redis操作Redisson实现数据互通

    这篇文章主要为大家介绍了Quarkus集成redis操作Redisson实现数据互通的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • 分布式利器redis及redisson的延迟队列实践

    分布式利器redis及redisson的延迟队列实践

    这篇文章为大家主要介绍了分布式利器redis及redisson的延迟队列实践,搜遍全网好像还没有使用redisson的延迟队列的,redisson作为一个分布式利器,这么好用的工具没人用有点可惜
    2022-03-03
  • 搭建单机Redis缓存服务的实现

    搭建单机Redis缓存服务的实现

    本文主要介绍了搭建单机Redis缓存服务的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 基于Redis实现阻塞队列的方式

    基于Redis实现阻塞队列的方式

    本文主要讲解基于 Redis 的方式实现异步队列,基于 Redis 的 list 实现队列的方式也有多种,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • Redis BloomFilter实例讲解

    Redis BloomFilter实例讲解

    这篇文章主要介绍了Redis BloomFilter实例。BloomFilter不需要存储key,节省空间,在某些对保密要求非常严格的场合有优势。想要进一步了解BloomFilter运用实例的小伙伴可以了解一下这篇文章
    2021-09-09

最新评论