【redis】渐进式遍历(scan)和数据库数据库管理
文章目录
- 概念
- SCAN
- 数据库管理
- 更改数据库——select
- 获取数据库中 key 个数——DBSIZE
- flushdb/flushall
概念
keys
可以一次性的把 redis
中所有的 key
都获取到
- 比较危险,可能一下得到太多
key
,从而堵塞redis
服务器(无暇处理其他命令)
通过“渐进式遍历”,就可以做到,既能够获取到所有的 key
,同时又不会卡死服务器
- 不是一个命令,把所有的
key
都拿到 - 而是每执行一次命令,只获取到其中一小部分。这样的话就能保证当前这一次操作不会太卡
- 要想得到所有的
key
就需要多次便利,多次执行渐进式遍历命令
SCAN
渐进式遍历是一组命令,这一组命令的使用方法是一样的,其中代表的命令:scan
- 此处涉及到关键概念:光标(
cursor
),就指向了当前遍历的位置- 光标设置成 0 了,就代表这次遍历是从头开始
- 返回值的前半部分,是告诉你,下次继续遍历,光标要从哪里开始
cursor
不能理解成“下标”,不是一个连续递增的整数!仅仅就是一个“字符串”。光标这个概念,程序员/客户端是不认识的,只有redis
服务器知道这个光标对应的位置
语法:
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
[MATCH pattern]
和前面的keys
命令是一样的[COUNT count]
:限制这一次遍历能够获取到多少元素,默认是10
- 此处的
count
和MySQL
里面的limit
不一样。 limit
是精确的;此处的count
只是给redis
服务器一个“提示/建议”,写入的count
和实际返回的key
的个数不一定是完全相同的,但是不会差太多
- 此处的
[TYPE type]
:redis
里面的key
都是string
,但是value
的类型不一样,这里可以指定想获取的key
类型
-
scan
指到 0 了,就代表遍历完了
-
count
这里的数字,不是每次遍历都得设置成一样 -
这里的渐进式遍历,在遍历过程中,不会在服务器这边存储任何的状态信息
- 这里的遍历是随时可以终止的,不会对服务器产生任何副作用
- 去烧烤店。吃饱了,还没上的菜不想要了,但是已经在烤了,所以退不了
- 如果想强行取消,此时服务器的状态仍然保留着,此时就会对服务器的运行造成一定影响
- 去超市。结账,扫了一半后面的东西不想要了,可以直接走,不影响
redis
的服务器不保留任何状态,遍历是可以随时中断的
渐进式遍历 scan
虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑
- 不仅仅是
redis
,遍历其他内容的时候,也是比较忌讳一边遍历一边修改的
数据库管理
MySQL
中有一个重要的概念—— database
- 一个
MySQL
服务器上可以有很多歌database
- 一个
database
上可以有很多表
其实在 redis
中,也是有 database
这样的概念的,只不过不想 MySQL
那样随意
redis
中的database
是现成的。我们用户不能创建新的数据库,也不能删除已有的数据库- 默认
redis
给我们提供了 16 个数据库(0-15),这 16 个数据库是相互隔离的,相互之间不会有影响(默认情况使用的数据库就是 0 号)
更改数据库——select
select dbIndex
不过我们实际使用 Redis
很少会关注到数据库,一般都是默认就用 0 号就可以了
获取数据库中 key 个数——DBSIZE
flushdb/flushall
flushdb
:删除当前库的所有key
flushall
:删除所有库的所有key