Redis(九)渐进式遍历 | 数据库管理

在这里插入图片描述

文章目录

  • 前言
  • 什么是渐进式遍历
  • SCAN
  • 数据库管理

前言

前面我们学习了针对 redis 五种基本数据类型和五种特殊数据类型的常用命令,其中通用命令 keys pattern 我们都知道是用来查询当前 redis 服务器中有哪些 key 的,而如果此时 redis 服务器中存在很多的 key 的话,使用 keys 命令就需要花费较多的时间,而又因为 redis 是单线程执行的模式,如果一个命令执行所需要的时间较长的话,就会造成 redis 服务器的阻塞。那么这就代表着我们应该尽量避免使用例如 keys * 这样的命令,但是如果我们真的需要知道当前 redis 服务器中有哪些 key 的时候该怎么办呢?

本篇文章,我们将学习一种遍历方式,叫做渐进式遍历,使用渐进式遍历一次命令执行只会遍历部分数据,而不会像 keys 命令一样一次遍历完所有的数据。

什么是渐进式遍历

Redis 中的渐进式遍历(Progressive Iteration)是一种处理大数据集遍历的技术,它允许客户端逐步地、分批次地获取数据,而不是一次性地获取整个数据集。这种遍历方式对于非常大的数据集特别有用,因为它可以减少内存使用和网络传输的开销,同时避免阻塞服务器。

渐进式遍历的核心思想是将遍历操作分解为多个小的步骤,每个步骤只处理数据集的一部分。客户端可以逐步地请求更多的数据,直到整个数据集都被遍历完。

渐进式遍历其实是一组命令,这一组命令的使用方法是一样的,其中的代表命令就是 SCAN

SCAN

SCAN 命令以渐进式的方式进行键的遍历。SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

这里的 cursor 是游标,用来告诉我们下一次使用 SCAN 渐进式遍历的时候从哪个位置开始遍历。这里的游标不是类似下标这样的概念,不一定下一次渐进式遍历的开始位置的游标就要大于上一次遍历的开始游标。

type 则是指定每次渐进式遍历的数据类型,这里的数据类型指的是 value 的数据类型。
在这里插入图片描述
每次使用 scan 渐进式遍历的返回值有两部分:第一部分是下次渐进式遍历游标开始的位置,第二部分就是遍历的数据。第一次渐进式遍历游标从 0 开始,当遍历完成所有的数据之后返回的游标值是 0。后面的 count 是说这次渐进式遍历遍历多少数据,默认是10,但是这里的 count 只是建议,实际的返回数据可能大于我们给定的 count 值也可能小于,这里是不确定的。

在这里插入图片描述

127.0.0.1:6379> MSET key1 111 key2 222 key3 333 key4 444 key5 555 key6 666 key7 777 key8 888 key9 999 key10 000
OK
127.0.0.1:6379> keys *1) "key7"2) "key3"3) "key4"4) "key5"5) "key6"6) "key10"7) "key8"8) "key9"9) "key2"
10) "key1"
127.0.0.1:6379> SCAN 0 count 3
1) "12"
2) 1) "key5"2) "key6"3) "key7"
127.0.0.1:6379> SCAN 12 count 3
1) "3"
2) 1) "key2"2) "key3"3) "key1"
127.0.0.1:6379> SCAN 3 count 3
1) "7"
2) 1) "key10"2) "key8"3) "key9"
127.0.0.1:6379> SCAN 7 count 3
1) "0"
2) 1) "key4"127.0.0.1:6379> SCAN 0 count 4
1) "2"
2) 1) "key5"2) "key6"3) "key7"4) "key2"
127.0.0.1:6379> SCAN 2 count 4
1) "7"
2) 1) "key3"2) "key1"3) "key10"4) "key8"5) "key9"
127.0.0.1:6379> SCAN 7 count 4
1) "0"
2) 1) "key4"

为什么我们每次渐进式遍历之后,redis 会给我们返回一个下一次渐进式遍历的游标值呢?这是因为在渐进式遍历的过程中,不会在 redis 服务器中存储任何的状态信息,所以也就不会在服务器这边保存你这一次渐进式遍历遍历到哪里了,而是会告诉你我这次遍历到哪里了,你下一次渐进式遍历应该从哪个位置开始,这个位置是需要我们自己来传给 redis 服务器的。也正是因为 redis 这样的机制,我们的渐进式遍历是随时可以终止的,是不会对 redis 服务器产生任何影响的。

  1. 灵活性与可控性:由于 SCAN 命令不保存状态信息,它允许客户端完全控制遍历的过程。客户端可以根据需要随时开始、暂停或继续遍历,而不需要担心服务器保存的状态信息可能会导致的潜在问题。这种灵活性使得 SCAN 命令更加适应于各种复杂的应用场景。

  2. 资源消耗低:不保存状态信息意味着服务器不需要为遍历操作分配额外的存储空间来维护状态。这有助于减少服务器的内存消耗,尤其是在处理大规模数据集时。同时,由于没有状态信息需要管理,遍历操作的开销也相对较低,这有助于提高整体的性能。

  3. 可中断性:由于遍历状态不由服务器保存,客户端可以在任何时候中断遍历操作,而不需要担心状态信息的丢失或不一致。这使得 SCAN 命令在处理长时间运行的任务或需要响应其他操作的场景时更加可靠。

  4. 容错性:由于状态信息不依赖于服务器的持久化存储,即使服务器在遍历过程中发生故障或重启,也不会影响遍历的进度或结果。客户端可以简单地重新开始遍历,而无需担心从故障中恢复状态信息的复杂性。

虽然渐进式遍历可以有效的解决 keys * 这样的类型命令对 redis 服务器产生阻塞的问题,但是渐进式遍历也存在问题:当在渐进式遍历的过程中,如果键发生了修改、增加、删除等的时候,可能就会导致我们渐进式遍历的结果出现重复或者遗漏,这点是需要我们注意的。

在渐进式遍历的过程中不应该对键的值和数量做出修改,就像 c++ 的迭代器,Java 的 for each 循环一样,如果在这个过程中遍历的容器或者集合中的元素发生修改可能就会出现问题。

数据库管理

在前面的 MySQL 中我们可以发现,在 MySQL 中可以有很多的数据库,一个数据库中可以有很多的表,而在 redis 中我们好像上来就是 set 和 get,我们也没有指定哪个数据库啊,那么也是否意味着 redis 中不存在数据库这样的概念呢?

其实不是的,redis 中也存在库这样的概念,只不过 redis 为我们提供了 16 个默认的数据库,编号从 0-15,这些数据库之间的数据是相互隔离的,不会相互影响,并且这些数据库是不允许我们对其进行删除操作的,不仅如此,redis 也不允许我们创建出新的数据库。redis 默认使用的数据库就是编号为 0 的数据库,所以也就不需要我们显式的指定使用哪个数据库。

如果我们想要更换其他的数据库,可以使用 SELECT dbindex 来切换其他数据库。

127.0.0.1:6379> keys *1) "key7"2) "key3"3) "key4"4) "key5"5) "key6"6) "key10"7) "key8"8) "key9"9) "key2"
10) "key1"
127.0.0.1:6379> select 5
OK
127.0.0.1:6379[5]> keys *
(empty array)

FLUSHDB [ASYNC | SYC] 命令可以异步或者同步的删除当前数据库中的所有键。

127.0.0.1:6379[5]> select 0
OK
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty array)

FLUSHALL 命令是删除所有数据库中的键。

DBSIZE 命令可以获取到当前数据库中 key 的数量。

127.0.0.1:6379> MSET key1 111 key2 222 key3 333 key4 444 key5 555
OK
127.0.0.1:6379> DBSIZE
(integer) 5
127.0.0.1:6379> SELECT 6
OK
127.0.0.1:6379[6]> DBSIZE
(integer) 0

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

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

相关文章

Pspnet

Pyramid Scene Parsing Network

Linux mount 挂载出现疑难问题;mount can‘t find in /etc/fstab

当挂载出现 “mount cant find in /etc/fstab” 疑难问题时,你需要检查挂载的虚拟文件目录是否已经被创建成功。 或者挂载路径不是一个文件目录,而不是一个文件。 如果是文件你就删除它,并且在重建为目录类型,如果这样都无法解决&…

mac安装虚拟机linux系统

需要下载的有:centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有: CentOS、ubuntu、redhat,选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

AI工具大揭秘:如何改变我们的工作和生活

文章目录 📑前言一、常用AI工具:便利与高效的结合1.1 语音助手1.2 智能推荐系统1.3 自然语言处理工具 二、创新AI应用:不断突破与发展2.1 医疗诊断AI2.2 智能家居2.3 无人驾驶技术 三、AI工具在人们生活中的应用和影响3.1 生活方式的变化3.2 …

夏目友人帐所有妖怪名单

夏目友人帐妖怪名单 夏目友人帐 第一季 2008.07.07第1话:猫和友人帐 / 猫と友人帐 菱垣 狞影 斑第2话:露神之祠 / 露神の祠 露神 濯第3话:八原的怪人 / 八ツ原の怪人 一只目 牛头(中级妖怪)第4话:时雨与少女…

MyBatisPlus @TableLogic实现全局自动逻辑删除

一、背景 有一天,小王在编写代码时实现了一个删除操作,但由于测试场景覆盖不全,上线后不慎删除了系统中的部分业务数据。幸运的是,系统已经开启了binlog日志功能,使得我们能够根据日志来恢复这些误删的数据。这一事故…

TransUNet或SwinUNet报错指南

Transformer与Unet的结合是本人的2024毕设项目,在此之前从未接触过该领域,一切从0开始的过程十分痛苦,希望能帮助到你们 本笔记不定时更新 文章目录 复现报错使用预处理Synapse数据集的通用问题使用预处理ACDC数据集的通用问题找不到require…

https自签名ssl证书生成流程

准备工作: 0.安装完整版的openssl openssl下载官网 安装到C:\OpenSSL32,也可以安装到其它盘,不要包含空格和中文 打开openssl.exe所在目录如:C:\OpenSSL32\bin,输入cmd.exe打开cmd控制台 1.创建ca文件夹 ,证书文件夹 mkdir …

基于Spring Boot的学生在线答疑系统设计与实现

基于Spring Boot的学生在线答疑系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录界面 教师登陆界面 问题发布信息界面&am…

堆内存分配策略傻傻不清楚

一、概述 1.JVM堆内存分为年轻代、老年代和持久代(JDK7及之前版本)或元空间(JDK8及之后版本)。 年轻代用于存放新创建的对象,老年代用于存放存活时间较长的对象。 持久代或元空间主要用于存放类信息、方法信息、常量池…

【Delphi 爬虫库 3】使用封装好的 HTML 解析库对 HTML 数据进行解析

文章目录 解析HTML的意义1、简单解析HTML代码2、实战解析HTML代码 解析HTML的意义 HTML是Web页面的构建语言,每个Web开发者都需要了解HTML的基础知识。但是,通过手动阅读和解析需要极大的心智和时间投入。这时候,我们就需要使用HTML在线解析…

WPF之XmlDataProvider使用

1,WPF XAML支持数据提供(DataProvider),但其提供的数据只供查看不可进行修改,删除,添加等。 数据提供者都继承自System.Windows.DataSourceProvider类,目前,WPF只提供两个数据提供者…

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容: Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…

Java web第五次作业

1.在idea中配置好数据源 2、视频案例中只给出了查询所有结果的示例,请自己完成添加、删除、修改操作的代码。以下供参 考。 Delete("delete from emp where id#{id}") public void delete(Integer id); 测试代码 Test public void testDelete(){ empMa…

「C++ STL篇 1-0」string类的使用

目录 〇、概念 一、string类的构造函数 二、赋值运算符重载 三、有关容量的操作 四、string对象的访问 五、遍历string对象的字符数组 六、string对象的修改 七、string对象的常用操作 八、字符串和数字间的转换 拓展】 练习】 源代码】 〇、概念 1. string类是什么&#xff1…

前后端分离实践:使用 React 和 Express 搭建完整登录注册流程

文章目录 概要整体架构流程技术名词解释ReactExpressReact RouterAnt Design 技术细节前端设计后端逻辑数据交互 小结 概要 本项目是一个基于React和Express的简单登录注册系统。通过前后端分离的方式,实现了用户的注册、登录和查看用户列表等功能。前端使用React框…

PostgreSQL 14 向量相似度搜索插件 (pgvector) 安装指南

本文是关于在 PostgreSQL 14 中安装并使用向量相似度搜索插件(pgvector)的详细指南。此插件允许用户在数据库中执行高效的向量运算,特别适用于机器学习模型的向量数据存储与检索场景。 环境需求 已安装PostgreSQL 14或更高版本。安装了Visual Studio 2022,用于编译插件。安装…

GitHub显示无法在此仓库中合并不相关的历史记录

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 GitHub显示无法在此仓库中合并不相关的历史记录 场景&…

Leetcode 3139. Minimum Cost to Equalize Array

Leetcode 3139. Minimum Cost to Equalize Array 1. 解题思路2. 代码实现 题目链接:3139. Minimum Cost to Equalize Array 1. 解题思路 这一题是一道hard的题目,而且看了一下答出率低的离谱,就一开始被吓到了,不过实际做了一下…

设计模式-概述

设计模式概述 1. 软件设计模式的产生背景2. 软件设计模式的概念3. 设计模式分类4. 软件设计原则4.1 开闭原则4.2 里氏代换原则4.3 依赖倒转原则4.4 接口隔离原则4.5 迪米特法则4.6合成复用原则 1. 软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中&…