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数据库的操作,分别是dbsize
、select
、flushdb
、flushall
命令,本机将通过具体的使⽤常⻅介绍这些命令。
🦋 切换数据库
select dbIndex
许多关系型数据库,例如MySQL⽀持在⼀个实例下有多个数据库存在的,但是与关系型数据库⽤字符来区分不同数据库名不同,Redis只是⽤数字作为多个数据库的实现。Redis默认配置中是有16 个数据库。select0操作会切换到第⼀个数据库,select15会切换到最后⼀个数据库。0号数据库和 15号数据库保存的数据是完全不冲突的(如图2-30所⽰),即各种有各⾃的键值对。默认情况下,我们处于数据库0。
图2-30Redis管理的数据库
🦋 清除数据库
flushdb/flushall命令⽤于清除数据库,区别在于flushdb只清除当前数据库,flushall会清楚所有数据库。
🔥 共勉
😋 以上就是我对 Redis:渐进式遍历
的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉