Redis KEY*模糊查询导致速度慢、阻塞其他 Redis 操作

Redis KEY*模糊查询导致交互速度慢、阻塞其他 Redis 操作

查询速度慢的原因

在Redis中,使用通配符 KEYS 命令进行键的模糊匹配(比如 KEYS key*)可能会导致性能问题,尤其是在数据集较大时。这是因为 KEYS 命令的实现需要遍历所有的键来匹配模式,这个过程的时间复杂度是 O(N),其中 N 是键的总数,因此使用KEYS*命令查询时,Redis的响应速度和Redis中数据量成正比

在大规模的生产环境中,遍历所有键可能会导致阻塞其他 Redis 操作,因为 KEYS 命令会持有数据库的写锁。此外,这也可能对性能产生负面影响,因为它需要消耗大量的计算资源。在 Redis 中,所有命令都是按顺序执行的,一个命令执行完成后,才会执行下一个命令。这个单线程模型是 Redis 的设计选择之一,有助于简化并发控制,提高数据一致性。

使用带前缀的通配符 KEYS prefix*

在 Redis 中,使用带前缀的通配符 KEYS prefix* 仍然需要遍历所有匹配前缀的键。虽然带有前缀的通配符能够减小匹配的范围,但是在 Redis 中并没有内置的索引结构能够直接加速带有通配符的键的查找。

这是因为Redis 的键是以哈希表的形式存储的,通过哈希函数计算出键的位置。当使用通配符 KEYS prefix* 时,Redis 无法直接利用哈希函数来快速定位符合条件的键,而需要遍历哈希表中的所有键,然后筛选匹配的键。

如果对于特定的使用场景,你经常需要根据键的前缀来查询数据,可以考虑使用 Redis 的有序集合(Sorted Set)来模拟带有前缀的键的查询。在有序集合中,你可以将键的前缀作为分数,然后使用范围查询来获取符合条件的键。这样可以更有效地执行带有前缀的查询,但这需要根据具体情况来设计和维护有序集合。

总体来说,避免在生产环境中使用 KEYS 命令,尤其是在大规模数据集上,因为它可能导致性能问题。在生产环境中,当出现使用KEYS*的场景时,一定要谨慎,考虑如何改变reid key的数据结构来避免使用;如果非要遍历所有keys不可,更推荐使用迭代命令(如 SCAN)以及结合合适的数据结构来执行查询,它可以用于迭代集合中的元素而不会阻塞整个数据库,特别是在大型数据库中,因为它将迭代的工作分散到多个步骤,并允许客户端逐步处理结果。这样可以避免 KEYS 命令可能引起的性能问题。

特殊场景SCAN 一个用于迭代集合元素的命令

SCAN 是 Redis 提供的一个用于迭代集合元素的命令。它可以用于逐步迭代集合中的元素,而不会一次性获取所有元素。这样可以减小对 Redis 服务器的负载,并且不会阻塞其他的 Redis 命令。

SCAN 命令的一般用法是:

SCAN cursor [MATCH pattern] [COUNT count]

其中:

  • cursor 是一个用于标识迭代状态的整数,初始时通常设置为 0。
  • MATCH pattern 是一个可选参数,用于匹配指定的模式。
  • COUNT count 是一个可选参数,用于指定每次迭代返回的元素数量。

SCAN 命令会返回一个包含两个元素的数组,第一个元素是下一次迭代所需的新的 cursor,第二个元素是包含元素的数组。

例子:

SCAN 0 COUNT 10

这个命令将从集合的开头开始迭代,每次返回最多 10 个元素。

使用 SCAN 命令相比于 KEYS 命令,主要优势在于它不会阻塞 Redis 服务器太长时间,因为它可以分阶段地获取数据。KEYS 命令可能会导致阻塞,因为它要在一次性操作中返回所有匹配的键。

需要注意的是,由于 SCAN 是迭代器,返回的结果可能不是实时的快照,而是在迭代开始时的一个快照。因此,在迭代过程中,集合的内容可能会发生变化。


使用 SCAN 命令时,通常需要在程序中进行多次调用直到迭代结束。每次调用 SCAN 命令都会返回下一批符合条件的元素和新的游标值,程序需要根据新的游标值决定是否继续迭代。

基本的流程如下:

  1. 使用 SCAN 0 命令开始迭代,初始游标设置为 0。
  2. 处理 SCAN 命令返回的结果,包括下一批元素和新的游标值。
  3. 如果新的游标值为 0,表示迭代结束;否则,使用新的游标值再次调用 SCAN 命令,重复步骤 2。
  4. 继续处理迭代结果,直到迭代结束。

这样的迭代方式可以确保不会对 Redis 服务器造成较大的负载,同时适应大型数据集的处理。

示例(伪代码):

cursor = 0while True:result = redis_client.scan(cursor, count=10)elements = result[1]# 处理当前批次的元素cursor = result[0]if cursor == 0:break

这样的迭代方式可以有效地处理大型数据集,减小对 Redis 服务器的压力。

摘星喵Pro
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/208983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多个大模型高效部署平台的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

mybatis和mybatisplus中对 同namespace 中id重复处理逻辑源码解析

一、背景 同事在同一个mapper.xml (namespace相同),复制了一个sql没有修改id,正常启动项目。但是我以前使用mybatis的时候如果在namespace相同情况下,id重复,项目会报错无法正常启动,后来看代码…

用户帐户限制(例如,时间限制)会阻止你登录。请与系统管理员或技术支持联系以获取帮助。

用户帐户限制(例如,时间限制)会阻止你登录。请与系统管理员或技术支持联系以获取帮助。 在Windows11远程连接Windows10时提示【用户帐户限制(例如,时间限制)会阻止你登录。请与系统管理员或技术支持联系以获取帮助。】我们该如何解决: 1、在…

React聚焦渲染速度

目录 一、引言 二、React.js的渲染速度机制 虚拟DOM Diff算法 三、优化React.js的渲染速度 避免不必要的重新渲染 使用合适的数据结构和算法 使用React Profiler工具进行性能分析 四、实际案例分析 五、总结 一、引言 在当今的Web开发领域,React.js无疑是…

C语言——螺旋矩阵(注释详解)

一、前言: 螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。 二、市面解法(较难理解,代码长度短): 根据阶数…

【ARMv8 SIMD和浮点指令编程】浮点数据转换指令——数据类型互转必备

浮点数据转换指令包括不同的浮点精度数之间的转换,还包括整型和浮点数之间的转化。 在了解数据转换指令前,必须学习 IEEE 754 定义的五种舍入规则。前两条规则舍入到最接近的值,其他的称为定向舍入: 舍入到最接近的值 Round to nearest, ties to even – rounds to the n…

Python 多线程和多进程并发执行

Python 多线程和多进程并发执行 引言多线程主要特点和概念多线程的使用threading 模块concurrent.futures 线程池 多进程主要特点和概念:多进程的使用:multiprocessing 模块concurrent.futures 进程池 选择合适的进程数 总结I/O 密集型任务CPU 密集型任务…

js过滤的方法示例

以下是几个常用的 JavaScript 过滤方法示例: filter() filter() 方法创建一个新的数组,其中包含通过测试函数的所有元素。该方法不会改变原始数组。 const numbers [1, 2, 3, 4, 5]; const filteredNumbers numbers.filter(num > num > 3); c…

销售技巧培训之如何提高建材销售技巧

建材销售市场竞争也日趋激烈。在这个充满挑战与机遇的市场中,掌握一定的销售技巧对于一个建材销售人员来说至关重要。本文将结合实际案例,探讨一些实用的建材销售技巧,帮助你更好地拓展业务。 一、了解客户需求 在销售过程中,首先…

sql2005日志文件过大如何清理

由于安装的时候没有计划好空间,默认装在系统盘,而且又没有做自动备份、截断事务日志等,很快LDF文件就达到十几G,或者几十G ,此时就不得不处理了。 备份和计划就不说了,现在就说下怎么把它先删除吧&#xf…

【深度学习】一维数组的 K-Means 聚类算法理解

刚看了这个算法,理解如下,放在这里,备忘,如有错误的地方,请指出,谢谢 需要做聚类的数组我们称之为【源数组】 需要一个分组个数K变量来标记需要分多少个组,这个数组我们称之为【聚类中心数组】…

mysql中count(*)、count(1)、count(主键)、count(字段)的区别

文章目录 count函数的语义count(主键)count(1)count(*)count(字段)替代方案explain或者show table status中间表或者其他数据库计数 以下分析都是基于 select count(?) from table 这个语句来分析,不带过滤条件。 count函数的语义 count() 是一个聚合函数&#x…

BFC(Block Formatting Contexts)块级格式化上下文

块格式化上下文(block formatting context) 是页面上的一个独立的渲染区域,容器里面的子元素不会在布局上影响到外面的元素。它是决定块盒子的布局及浮动元素相互影响的一个因素。 下列情况将创建一个块格式化上下文: 使用float…

阿里云轻量应用服务器与云服务器ECS对比

与云服务器ECS相比,轻量应用服务器使用门槛较低,配置简便,能让您快速上手并部署简单的应用或网站,更适合个人开发者、学生等用户。本文介绍轻量应用服务器与云服务器ECS的特点和区别。 产品对比 轻量应用服务器与云服务器ECS的产…

IO多路转接之select

IO多路转接之select 1. IO多路转接(复用)2. select2.1 函数原型2.2 细节描述 3. 并发处理3.1 处理流程3.2 通信代码 原文链接 1. IO多路转接(复用) IO多路转接也称为IO多路复用,它是一种网络通信的手段(机…

算法训练营Day10(栈和队列)

理论知识 java语言的栈和队列。这篇文章总结的不错 http://t.csdnimg.cn/cOC8q 232.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; public class MyQueue {// 3 4// in// out 4 3Stack<Integer> in;Stack<Integer> out;public My…

C# 计算两个日期的相差天数

string str1 "2017-2-13 23:59:59"; string str2 "2017-2-14 0:00:01"; DateTime d1 Convert.ToDateTime(str1); DateTime d2 Convert.ToDateTime(str2); Console.WriteLine(d1.Date); Console.WriteLine(DateTime.Now);//当前时间 Console.WriteLine(…

【目标检测算法】IOU、GIOU、DIOU、CIOU

目录 参考链接 前言 IOU(Intersection over Union) 优点 缺点 代码 存在的问题 GIOU(Generalized Intersection over Union) 来源 GIOU公式 实现代码 存在的问题 DIoU(Distance-IoU) 来源 DIOU公式 优点 实现代码 总结 参考链接 IoU系列&#xff08;IoU, GIoU…

kubernetes的服务发现(二)

如前面的文章我们说了&#xff0c;kubernetes的服务发现是服务端发现模式。它有一个服务注册中心&#xff0c;使用DNS作为服务的注册表。每个集群都会运行一个DNS服务&#xff0c;默认是CoreDNS服务。每个服务都会在这个DNS中注册。注册的大致过程&#xff1a; 1、向kube-apise…

WPF使用WebBrowser报脚本错误问题处理

前言 WPF使用WebBrowser报脚本错误问题处理,我们都知道WPF自带的WebBrowser都用的IE内核,但是在特殊的条件下我们还需要用到它,比如展示纯html简单的页面。再展示主流页面的时候比如用到Jquery高级库或者VUE等当前主流站点时经常就会报JS脚本错误,在Winform里面我们一句代…