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

相关文章

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话:时雨与少女…

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…

【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显示无法在此仓库中合并不相关的历史记录 场景&…

基于 Dockerfile 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 镜像创建 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 2.4 生成镜像 2.5 创建 Nginx 镜像的容器 2.6 验证nginx 3、Mysql 镜像创建 3.1 建立工作目录并上传相关安装包 3.2 编写…

linux内核源码分析--核心网络文件和目录

图3-2显示了在/proc/sys中由网络代码所使用的主要目录,就每个目录而言,都列出了在哪一章描述其文件。 proc/sys/net bridge ipv4 core route neigh conf 图3-2/proc/sys/net 中的核心目录 根据前借所述,我们来看net中的树根是如何定义的&…

【YOLO】目标检测 YOLO框架之train.py参数含义及配置总结手册(全)

1.一直以来想写下基于YOLO开源框架的系列文章,该框架也是日常项目开发中常用的一款工具,最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下YOLO目标检测相关知识体系,之前实战配置时总是临时性检索些注释含义,但…

java下乡扶贫志愿者招募管理系统springboot-vue

计算机技术在现代管理中的应用,使计算机成为人们应用现代技术的重要工具。能够有效的解决获取信息便捷化、全面化的问题,提高效率。 技术栈 前端:vue.jsElementUI 开发工具:IDEA 或者eclipse都支持 编程语言: java 框架&#xff1…

[C++基础学习-04]----C++数组详解

前言 在C中,数组是一种用来存储相同类型元素的数据结构。一维数组是最简单的数组形式,它由一系列按顺序存储的元素组成。二维数组则是由一维数组构成的数组,可以看作是一堆一维数组堆叠在一起形成的矩阵。 正文 01-数组简介 一维数组和二维…

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置,并带移动动画 响应鼠标事件,图片缩放动画 点击水波纹动画 项目demo演示如下所示: 项目部分代码如下所示: #i…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP,使AR4和AR3成为eBGP,AR4和AR5成为iBGP对等体…