前言
之前我们所了解到的 keys * 是一次性把整个 redis 中所有的 key 都获取到,但是整个操作比较危险,可能会一下子的都太多的 key,阻塞 redis 服务器.
通过渐进式遍历,就可以做到,既能获取所有的 key ,同时又不会卡死服务器~
渐进式遍历不是一个命令就把所有 key 都拿到,而是每执行一次命令,只获取其中的一小部分,这样就保证了当前这一次操作不会太卡~
一、scan 命令
scan 就是渐进式遍历的代表命令.
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
cursor:此处设计到一个光标的概念,光标就指向了当前遍历的位置(起初光标位置为 0),每次遍历都会产生一个光标位置,下次使用 scan 遍历时就需要接着上次光标产生的位置.
[MATCH pattern]:这里和之前介绍的 keys 命令是一样的.
[COUNT count]:限制一次遍历能过获取到多少元素(注意,这里的 count 只是给 redis 服务器的 “建议”,写入的 count 和实际返回的 key 的个数不一定完全相同,但是不会差很多).
[TYPE type]:redis 里的 key 都是 string ,但是 value 类型是不一样的.
假设目前有如下 keys
通过渐进式遍历就可以得到如下结果:
Ps:渐进式遍历,在遍历的过程中,不会在服务器这边存储任何的状态信息,此处的遍历是随时可以终止的,解决了阻塞问题。
但是值得注意的是如果在遍历期间键有所变化(增加、修改、删 除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。
二、数据库管理命令
在 mysql 上有个重要的概念——database,可以进行随心所欲的 创建/删除 数据库~
redis 也有 database 这样的概念,只不过不像 mysql 那样随意. redis 中的 database 是现成的,咱们不能创建新的数据库,也不能删除已有的数据库~
默认的 redis 给我们提供了 16 个数据库,编号为 0 - 15,这 16 个数据库之间的数据是隔离的,默认情况下使用数据库就是 0 号.
Ps:实际使用 redis 很少会关注数据库,一般都是使用 0 号就可以了.
select
select dbIndex
使用这个命令就可以进行数据库的切换
dbsize
获取当前数据库中的 key 的个数.
flushdb / flushall
flushdb 用来删除当前数据库中所有的 key.
flushall 用来删除所有数据库中的 key.
Ps:永远不要在线上环境执⾏清除数据的操作,除⾮你想体验⼀把 “从删库到跑路” 的操作