Redis:渐进式遍历

🌈 个人主页:Zfox_

🔥 系列专栏:Redis

🔥 渐进式遍历

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

图2-29scan命令渐进式遍历
  • ⾸次scan从0开始.
  • 当scan返回的下次位置为0时,遍历结束.

🦋 SCAN

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

语法:

cpp 复制代码
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

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

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

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

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

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

首先插入几个key值:

cpp 复制代码
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命令:

cpp 复制代码
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 的限制来进行演示效果:

第一次查找:

cpp 复制代码
127.0.0.1:6379> scan 0 count 3
1) "2"
2) 1) "key8"
   2) "key5"
   3) "key1"

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

cpp 复制代码
127.0.0.1:6379> scan 2 count 3
1) "13"
2) 1) "key9"
   2) "key4"
   3) "key6"

下面进行第三次查找:

cpp 复制代码
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命令,本机将通过具体的使⽤常⻅介绍这些命令。

🦋 切换数据库

cpp 复制代码
select dbIndex

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

图2-30Redis管理的数据库


🦋 清除数据库

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

🔥 共勉

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

相关推荐
施嘉伟2 分钟前
浅谈信创数据库改造重难点
数据库
草莓熊Lotso17 分钟前
Linux 进阶指令实操指南:文件查看、时间管理、搜索压缩全场景覆盖(附高频案例)
linux·运维·服务器
Cx330❀17 分钟前
《Linux进阶指令实操指南》:文件查看、时间管理、搜索压缩全覆盖(附高频案例)
linux·运维·服务器
亚雷27 分钟前
深入浅出达梦共享存储集群数据同步
数据库·后端·程序员
努力努力再努力wz38 分钟前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
计算机学长felix44 分钟前
基于SpringBoot的“基于数据安全的旅游民宿租赁系统”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·旅游
施嘉伟1 小时前
SQL Server安全配置全面检查与优化方案
数据库·安全
DemonAvenger1 小时前
深入浅出 Redis 布隆过滤器:从原理到实战,10 年经验总结
数据库·redis·性能优化
冻咸鱼1 小时前
MySQL中的约束详解
数据库·mysql·约束类型