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:渐进式遍历 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉

相关推荐
ulias2122 小时前
Linux系统中的权限问题
linux·运维·服务器
沃尔威武4 小时前
数据库 Sinks(.net8)
数据库·.net·webview
青花瓷4 小时前
Ubuntu下OpenClaw的安装(豆包火山API版)
运维·服务器·ubuntu
Dreamboat¿5 小时前
SQL 注入漏洞
数据库·sql
Dream of maid5 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾5 小时前
统信系统UOS常用命令集
linux·运维·服务器
曹牧5 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星6 小时前
MySQL count()函数的用法
数据库·mysql
末央&6 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花6 小时前
数据库知识复习07
数据库·作业