当前位置: 首页 > java >正文

Redis:渐进式遍历

🌈 个人主页:Zfox_
🔥 系列专栏:Redis

🔥 渐进式遍历

Redis使⽤scan命令进⾏渐进式遍历键,进⽽解决直接使⽤keys获取键时可能出现的阻塞问题。每次scan命令的时间复杂度是O(1),但是要完整地完成所有键的遍历,需要执⾏多次scan。整个过程如图2-29所⽰。

图2-29scan命令渐进式遍历

在这里插入图片描述

  • ⾸次scan从0开始.
  • 当scan返回的下次位置为0时,遍历结束.

🦋 SCAN

以渐进式的⽅式进⾏键的遍历。

语法:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

返回值:下⼀次scan的游标(cursor)以及本次得到的键。

这里面提到了几个比较重要的概念,首先是 cursor,这个内容其实就是前面说的光标,本质上就是对于服务器来说的一种索引,这个光标的值是多少不重要,也不需要知道,只需要传递给服务器即可

第二个表示的是 pattern,这个和 keys 命令是一样的,就是类似于正则表达式的规则,进行筛选某些特定的内

第三个表示的是 count,表示的是一次要获取多少个元素,这里的 count 表示的更多的是一种提示和建议,只是对于服务器的一种建议,而至于服务器采取这个建议与否,就不一定了

第四个说的是类型,对于 Redis 当中,key 值表示的都是 string,但是 value的值却是五花八门,所以需要指定对应的类型,下面演示使用场景

首先插入几个key值:

127.0.0.1:6379> mset key1 111 key2 222 key3 333 key4 444 key5 123 key6 eee key7 432 key8 eee key9 999
OK
127.0.0.1:6379> keys *
1) "key9"
2) "key8"
3) "key6"
4) "key7"
5) "key4"
6) "key5"
7) "key1"
8) "key3"
9) "key2"

而如果我们使用的是scan命令:

127.0.0.1:6379> scan 0
1) "0"
2) 1) "key8"2) "key5"3) "key1"4) "key9"5) "key4"6) "key6"7) "key3"8) "key7"9) "key2"

此时会返回给一个下标,这个下标就是下次要进行遍历的索引,我们此时需要再次对这个下标进行查找,而特殊的是,如果这个下标是0,表示的是此次搜索已经结束了,下面我通过 count 的限制来进行演示效果:

第一次查找:

127.0.0.1:6379> scan 0 count 3
1) "2"
2) 1) "key8"2) "key5"3) "key1"

此时展示的下标是2,下面进行第二次查找:

127.0.0.1:6379> scan 2 count 3
1) "13"
2) 1) "key9"2) "key4"3) "key6"

下面进行第三次查找:

127.0.0.1:6379> scan 13 count 3
1) "0"
2) 1) "key3"2) "key7"3) "key2"

此时下标是0,表示的是已经查找完毕了,已经结束了

如上所示就是查找的基本过程

🦋 渐进式遍历的增加修改删除

在渐进式遍历中,虽然解决了阻塞的问题,但是一个比较严重的问题是,如果在遍历期间的键有发生变化,那其实这件事是比较严重的事,这点其实和 C++ 的 STL 是比较相似的

在 C++ 的 STL 中,也有过类似的说法,比如在进行遍历的时候,如果在途中进行了增加修改和删除,那么可能会产生迭代器失效的问题,在Redis中,虽然不至于像 C++ 中直接报错,但是也可能会导致遗漏的情况出现

因此最好在 Redis 进行渐进式遍历的时候不要对其进行任何的修改

🦋 database

在 MySQL 中,存在一个比较重要的概念,database

那么在 Redis 中,似乎没有这样的概念,那其实这样的场景已经提前设置好了,在 MySQL 中的 Redis 已经被设置为 16 个,并且用户是不能对它进行增加或者删除,每一个数据库和数据库之间也是处于隔离的状态

不过,在实际的 Redis 使用中,其实很少会出现这样的使用场景,因此默认使用 0号 Redis 数据库就可以了

🔥 数据库管理

Redis提供了⼏个⾯向Redis数据库的操作,分别是dbsizeselectflushdbflushall命令,本机将通过具体的使⽤常⻅介绍这些命令。

🦋 切换数据库

select dbIndex

许多关系型数据库,例如MySQL⽀持在⼀个实例下有多个数据库存在的,但是与关系型数据库⽤字符来区分不同数据库名不同,Redis只是⽤数字作为多个数据库的实现。Redis默认配置中是有16 个数据库。select0操作会切换到第⼀个数据库,select15会切换到最后⼀个数据库。0号数据库和 15号数据库保存的数据是完全不冲突的(如图2-30所⽰),即各种有各⾃的键值对。默认情况下,我们处于数据库0。

图2-30Redis管理的数据库

在这里插入图片描述
在这里插入图片描述

🦋 清除数据库

flushdb/flushall命令⽤于清除数据库,区别在于flushdb只清除当前数据库,flushall会清楚所有数据库。

在这里插入图片描述

🔥 共勉

😋 以上就是我对 Redis:渐进式遍历 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

http://www.xdnf.cn/news/13611.html

相关文章:

  • ArkUI-X构建Android平台AAR及使用
  • ROS2 工作空间中, CMakeLists.txt, setup.py和 package.xml的作用分别是?
  • 【编译原理】题目合集(一)
  • 初识MySQL · 事务 · 下
  • TCP/IP 网络编程 | Reactor事件处理模式
  • 像素跟踪 跟踪像素 算法总结
  • 【慧游鲁博】【12】小程序端 · 智能导览对接后端文物图片识别功能
  • WEB JWT
  • java复习 09
  • 【开源工具】:基于PyQt5的智能网络驱动器映射工具开发全流程(附源码)
  • WWDC 2025 开发者特辑 | 肘子的 Swift 周报 #088
  • 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 1. 摄像机几何
  • 2025最新软件测试八股文,查漏补缺(含答案+文档)
  • Spring Cloud Gateway 介绍
  • 离线部署openstack 2024.1 neutron
  • 离线部署openstack 2024.1 keystone
  • AI Agent 的架构与技术体系分析
  • 新能源知识库(40)一个省的综合电价由哪些因素决定?
  • C++ call_once用法
  • 基础知识:抽象类成员变量的继承与使用
  • Web APIS Day04
  • BlogX项目数据库读写分离AI面试题
  • 海外打车代驾app多语言切换模块设计
  • CentOs7.x系列IP地址由动态改静态(解决远程连接掉线问题)
  • 字符串|数组|计算常见函数整理-竞赛专用(从比赛真题中总结的,持续更新中)
  • 7.Vue的compute计算属性
  • atomicity of memory accesses
  • 【知识图谱构建系列1】数据集介绍
  • 本地docker部署的dify,不用git命令如何无损升级?
  • Vue3前端项目Docker容器化部署工作报告