redis—— 渐进式遍历

目录

为啥不用keys*遍历? 

 引入渐进式遍历

SCAN进行渐进式遍历

格式及参数说明

使用示例 

注意


 

为啥不用keys*遍历? 

之前学过key*  获取所有的key,但是这个操作可能会一次性得到太多的key,阻塞redis服务器,所以不建议在生产环境中使用。

  1. 性能问题:KEYS * 命令需要遍历整个数据库中的所有键名,这对于大型的 Redis 数据库来说会非常耗时和资源消耗。

  2. 阻塞问题:KEYS * 命令会阻塞 Redis 服务器的主线程,这意味着在执行这个命令期间,Redis 将无法处理其他客户端的请求。

  3. 安全问题:如果在生产环境中误操作使用 KEYS * 命令,可能会导致非常严重的安全问题。例如,可能会返回包含敏感信息的键名,或者删除一些重要的键值对

 引入渐进式遍历

Redis渐进式遍历允许我们在不阻塞Redis服务器的情况下,逐步获取大量的数据。所谓渐进式,不是一次性把所有Key拿到,而是每当执行一次命令,只获取到其中的一部分(多次迭代,逐步获取)。这样保证当前这一次操作不会太卡。多执行几次渐进式遍历,就可以得到所有的key,相当于化整为零

SCAN进行渐进式遍历

在Redis中,可以使用SCAN命令进行渐进式遍历。SCAN命令通过游标来记录当前遍历的位置,并返回一批键值对。我们可以使用返回的游标继续下一次遍历,直到完成遍历为止。

格式及参数说明

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
#pattern等同于key中的pattern通配符
#count限制这一次遍历能够获取到多少元素,默认是10;与mysql中的limit不同;
#limit精确,redis对于count只是一个建议、提示,并且它和最后的结果也比一定一致
  • cursor 表示游标,用来记录当前遍历的位置,不能理解为下标并不是一个连续递增的整数,仅仅是一个字符串,供服务器使用;MATCH 参数表示要匹配的键名模式;
  • COUNT 参数表示每次遍历返回的最大元素个数,所以最后返回的结果条数并不一定与count值相等。COUNT这个里的数字,不是说每次遍历都得设置成一样。这
  • 其中执行命令的前半部分:下次遍历光标开始的位置.(这与传统的下标不同);后半部分:真正遍历到的key内容;
  • 当命令返回的cursor回到0了,才说明遍历结束了。

 

使用示例 

# 遍历整个数据库
SCAN 0
# 输出结果为:(10086, [key1, key2, key3, ...])# 遍历数据库中匹配指定模式的键
SCAN 0 MATCH "prefix:*"
# 输出结果为:(10086, [prefix:key1, prefix:key2, prefix:key3, ...])# 分批遍历数据库中的键
SCAN 0 COUNT 10
# 输出结果为:(10086, [key1, key2, key3, ..., key10])
#使用SCAN命令从游标0开始,每次返回最多10个键值对。
#如果还有更多的数据需要遍历,返回的结果中会包含一个新的游标值,我们可以使用这个新的游标值进行下一次遍历。
# 第一次执行scan 0
127.0.0.1:6379> scan 0
1) "11"
2)  1) "user"2) "a"3) "test"4) "user.name"5) "hk"6) "y"7) "user.city"8) "b"9) "list1"10) "c"# 使用新的cursor = '11',执行scan 11
127.0.0.1:6379> scan 11
1) "0"
2) 1) "list2"2) "k"3) "x"

运行命令和结果解释:

1、第一次执行scan 0 ,返回结果包括两部分,第一部分 11 就是下次执行scan命令需要的cursor参数,第二部分是返回的10个键。

2、第二次执行scan 11 ,得到的结果是 “0”,说明所有的键都已经被遍历过了。

如果还有更多的数据需要遍历,返回的结果中会包含一个新的游标值,我们可以使用这个新的游标值进行下一次遍历。

需要注意,  由于Redis是一个内存数据库,如果要遍历的数据集比较大,可能会对服务器性能产生一定的影响。此外,由于Redis是一个键值存储数据库,遍历的顺序是不确定的。

总结一下,Redis的渐进式遍历通过SCAN命令实现,可以高效地逐步获取大量的数据。在实际使用中,我们可以根据需求设置合适的COUNT参数来控制每次返回的数据量,以及根据返回结果中的游标值来进行下一次遍历。每次使用 SCAN 命令遍历时,都需要将上一次遍历的游标作为下一次遍历的参数传递进去,以便继续从上次遍历结束的地方开始。因此,使用 SCAN 命令进行渐进式遍历时需要编写一些代码来管理游标。

注意事项

  • 渐进式遍历在遍历过程中,不会在服务器存储任何的状态信息,此处的遍历随时可以终止。

举个例子来理解: 

比如,我去买煮馍吃,商家都做了一半了,此时我想取消。

在这个例子中,我相当于客户端,商家相当于服务器, 如果我想取消,此时已经在服务器保留了状态信息,此时就会对服务器的运行造成影响。但是redis的服务器不保留任何状态

  • scan命令能有效的解决keys命令带来的阻塞问题,但是却带来新的问题。

    在scan过程中,如果键发生了变化(增、删、改),那么有可能会出现新增的键没有遍历到或者遍历出了重复键的情况。这是在开发过程中需要注意到的地方。

     

    使用迭代器或foreach循环遍历集合时,如果在遍历过程中直接调用集合的修改方法(如add、remove等),会导致迭代器的内部状态与集合的实际状态不一致,从而抛出ConcurrentModificationException异常。 

     

 

 

 

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

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

相关文章

笔记62:注意力汇聚 --- Nadaraya_Watson 核回归

本地笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章:动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a

【一维数组】交换数组

题目 将数组A中的内容和数组B中的内容进行交换。&#xff08;数组一样大&#xff09; 解题方式通过函数封装可以实现任意类型的数组元素交换 思路来源&#xff1a;qsort函数的模拟实现 void Change_arr2(void* ch1, void* ch2, size_t num, size_t sz) {for (int i 0; i < …

.net core 事务

在 .NET Core 中&#xff0c;可以使用 Entity Framework Core 来实现事务处理。下面是一个简单的示例&#xff0c;展示了如何在 .NET Core 中使用 Entity Framework Core 来创建和执行事务&#xff1a; using System; using Microsoft.EntityFrameworkCore; using System.Tran…

Docker配置Halo搭建个人博客-快速入门

Docker配置Halo搭建个人博客-快速入门 1 官方文档2 安装Halo2.1 创建Halo主目录2.2 远程下载配置文件2.3 编辑配置文件2.4 拉取最新镜像2.6 查看容器2.7 开放服务器的防火墙 3 运行3.1 运行项目3.2 停止项目 4 常见问题4.1 没有权限4.2 ommand netstart not found, did you mea…

寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 &#xff1a;本题难点在于时间复杂度的掌握&#xff0c; 思路&#xff1a;把两个数组合为一个数…

如何在自己的github仓库建立xv6-labs-2020项目

由于github上没有放出xv6-labs-2020的源代码版本&#xff0c;所以如果想在github上建立自己关于这个实验的仓库&#xff0c;可以遵循下面步骤&#xff1a; 首先在某一个地方clone下源代码 git clone git://g.csail.mit.edu/xv6-labs-2020然后进入该文件夹运行git bash或者其他…

8.0 泛型

通过之前的学习&#xff0c;读者可以了解到&#xff0c;把一个对象存入集合后&#xff0c;再次取出该对象时&#xff0c;该对象的编译类型就变成了Object类型&#xff08;尽管其在运行时类型没有改变&#xff09;。集合设计成这样&#xff0c;提高了它的通用性&#xff0c;但是…

JAVA Spring boot Process finished with exit code 0

JAVA Spring boot Process finished with exit code 0 原因&#xff1a; 检查配置文件是否引入spring-boot-starter-web配置依赖 问题解决: 1.maven: pom引入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-st…

Git的原理与使用(一):Git的基本操作(包含:版本回退)

Git原理与使用一 一.Git的初识与安装1.什么是Git2.如何安装Git1.git命令与git help(Git下的"man手册")2.centos下安装Git3.ubantu下安装Git 二.Git的前置操作与前置知识1.创建Git本地仓库2.配置Git3.理解Git的分区1.工作区2.暂存区3.版本库4.分区关系总结 三.添加文件…

springboot启动Table ‘xxx‘ already exists

jpa.generate-ddl和jpa.hibernate.ddl-auto都可以控制是否执行datasource.schema脚本&#xff0c;来初始化数据库结构&#xff0c;只要有一个为可执行状态就会执行&#xff0c;比如jpa.generate-ddl:true或jpa.generate-ddl:update&#xff0c;并没有相互制约上下级的关系。 要…

Android修行手册 - 使用ViewPager2实现画廊效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

web前端开发规范、HTML规范、JavaScript规范、style规范

MENU 前言目的 HTML规范用法规范注释规范 CSS规范用法规范书写顺序样式覆盖注释规范 JavaScript规范用法规范组件选项注释规范 命名规范目录命名图片命名文件命名方法命名样式命名常用词 工程结构目录构建代码风格 Git规范分支说明使用说明 相关连接 前言 目的 规范的目的是为…

唯创知音WTN6系列语音芯片:高音频采样率与精细音量控制赋能广泛应用

在语音芯片领域&#xff0c;唯创知音的WTN6系列语音芯片以其出色的性能和广泛的应用领域&#xff0c;无疑是行业的一颗璀璨明星。近期&#xff0c;该系列芯片实现了音频采样率32kHz的突破&#xff0c;以及16级音量控制的精细调节&#xff0c;进一步提升了其在各类应用中的表现。…

小航助学题库蓝桥杯题库stem选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…

Hive -- 基本概念

1、什么是Hive&#xff1a; Hive是数据仓库建模的工具之一&#xff0c;通过向hive中写一个交互式的sql&#xff0c;在海量数据中查询分析得到结果的平台。 2、Hive的优缺点&#xff1a; 1、优点&#xff1a; 1、操作接口采用类sql语法&#xff0c;提供快速开发的能力&#x…

解决ansible批量加入新IP涉及known_hosts报错的问题

我们把一批新的IP加入到ansible的hosts文件&#xff0c;比如/etc/ansible/hosts&#xff0c;往往会有这样的提示&#xff0c; 因为本机的~/.ssh/known_hosts文件中并有fingerprint key串&#xff0c;使用ssh连接目标主机时&#xff0c;一般会提示是否将key字符串加入到~/.ssh/…

如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

中国北斗:守护萨雷兹湖一方安澜

中国北斗&#xff1a;守护萨雷兹湖一方安澜 在第三届“一带一路”国际合作高峰论坛数字经济高级别论坛上&#xff0c;由中国经济信息社、国家发展改革委高技术司、国家数据局联合编制的《数字“慧”就发展之路》中英文图文集正式发布&#xff0c;展现了中国与共建“一带一路”国…

阶乘之和(n<50)

#include<iostream> using namespace std; int a[101] { 0 }, s[101] { 0 }; //计算阶乘的每一个因素 void change(int x) { int g 0;//进位 for (int i 100; i > 0; i--) { a[i] a[i] * x g;//将当前因素乘到数组a中 g a[i] / 10;//…

PHP中关于func_get_args()方法

首先呢这个函数出现的是比较早的,大致应该是PHP4出现的, func_get_args — 返回一个包含函数参数列表的数组 说明 func_get_args(): array 获取函数参数列表的数组。 该函数可以配合 func_get_arg() 和 func_num_args() 一起使用&#xff0c;从而使得用户自定义函数可以接…