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,一经查实,立即删除!

相关文章

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语言——螺旋矩阵(注释详解)

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

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

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

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

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

IO多路转接之select

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

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

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

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

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

【精选】设计模式——工厂设计模式

工厂设计模式是一种创建型设计模式,其主要目的是通过将对象的创建过程封装在一个工厂类中来实现对象的创建。这样可以降低客户端与具体产品类之间的耦合度,也便于代码的扩展和维护。 工厂设计模式: 以下是Java中两个常见的工厂设计模式示例…

C++ 关于结构体struct的一些总结

文章目录 一、 结构体(struct)是什么?(1)概念(2)struct 与 calss 的区别 二、定义、声明与初始化(1)三种定义结构体的方法:(2)结构体变量初始化 三、结构体嵌…

C++实现进程端口网络数据接收系统设计示例程序

一、问题描述 最近做了一道简单的系统设计题&#xff0c;大概描述如下&#xff1a; 1.一个进程可以绑定多个端口&#xff0c;用于监听接收网络中的数据&#xff0c;但是一个端口只能被一个进程占用 2.1 < pid < 65535, 1 < port < 100000, 1 < topNum < 5, …

C++:vector增删查改模拟实现

C:vector增删查改模拟实现 前言一、迭代器1.1 非const迭代器&#xff1a;begin()、end()1.2 const迭代器&#xff1a;begin()、end() 二、构造函数、拷贝构造函数、赋值重载、析构函数模拟实现2.1 构造函数2.1.1 无参构造2.1.2 迭代器区间构造2.1.3 n个值构造 2.2 拷贝构造2.3 …

vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)

目录 一、什么是Vue路由导航守卫&#xff1f; 二、全局守卫 1、beforeEach 下面是一个beforeEach的示例代码&#xff1a; 2、beforeResolve 下面是一个beforeResolve的示例代码&#xff1a; 3、afterEach 下面是一个afterEach的示例代码&#xff1a; 三、路由独享守卫…

044:vue中引用json数据的方法

第044个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

多相Buck的工作原理

什么是多相Buck电源&#xff1f; 多相电源控制器是一种通过同时控制多个电源相位的设备&#xff0c;以提供稳定的电力供应。相位是指电源中的电流和电压波形。多相控制器的设计旨在最大程度地减小电力转换系统的纹波&#xff0c;并提高整体能效。它通常包含一系列的功率级联&a…

结构化布线系统

满足下列需求&#xff1a; 1.标准化&#xff1a;国际、国家标准。 2.实用性&#xff1a;针对实际应用的需要和特点来建设系统。 3.先进性&#xff1a;采用国际最新技术。5-10年内技术不落后。 4.开放性&#xff1a;整个系统的开放性。 5.结构化、层次化&#xff1a;易于管理和维…

Matplotlib数据可视化

绘图基础语法 &#xff11; 创建画布并且创建子图 首先创建一个空白的画布&#xff0c;并且可以将画布分为几个部分&#xff0c;这样就可以在同一附图上绘制多个图像。 plt.figure 创建一个空白画布&#xff0c;可以指定画布大小、像素 figure.add_subplot 创建并且选中子…

【web安全】文件读取与下载漏洞

前言 菜某整理仅供学习&#xff0c;有误请赐教。 概念 个人理解&#xff1a;就是我们下载一个文件会传入一个参数&#xff0c;但是我们可以修改参数&#xff0c;让他下载其他的文件。因为是下载文件&#xff0c;所以我们可以看到文件里面的源码&#xff0c;内容。 文件读取…

swiftUi——颜色

在SwiftUI中&#xff0c;您可以使用Color结构来表示颜色。Color可以直接使用预定义的颜色&#xff0c;例如.red、.blue、.green等&#xff0c;也可以使用自定义的RGB值、十六进制颜色代码或者系统提供的颜色。 1. 预定义颜色 Text("预定义颜色").foregroundColor(.…