redis keys和scan命令
redis的keys命令
1.自1.0.0起可用。
时间复杂度: O(N),其中N为数据库中密钥的数目,假设数据库中的密钥名称和给定模式的长度有限。
返回所有匹配的键pattern。
尽管此操作的时间复杂度为O(N),但恒定时间却很短。例如,运行在入门级笔记本电脑上的Redis可以在40毫秒内扫描一百万个密钥数据库。
警告:将KEYS视为命令,仅应在生产环境中格外小心使用。在大型数据库上执行时,可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS。如果您正在寻找一种在键空间的子集中查找键的方法,请考虑使用SCAN或sets。
支持的全局样式:
h?llo matches hello, hallo and hxllo
h*llo matches hllo and heeeello
h[ae]llo matches hello and hallo, but not hillo
h[^e]llo matches hallo, hbllo, ... but not hello
h[a-b]llo matches hallo and hbllo
示列:
redis> MSET firstname Jack lastname Stuntman age 35
"OK"
redis> KEYS *name*
1) "lastname"
2) "firstname"
redis> KEYS a??
1) "age"
redis> KEYS *
1) "lastname"
2) "firstname"
3) "age"
redis>
返回值
数组回复:匹配的键列表pattern。
例子
redis> MSET名姓杰克姓特技演员年龄35岁
“好”
redis> KEYS 名称
1)“姓氏”
2)“名字”
redis> KEYS一个?
1)“年龄”
redis> 按键*
1)“姓氏”
2)“名字”
3)“年龄”
Redis>
redis的scan命令
从2.8.0开始可用。
时间复杂度:每次通话O(1)。O(N)表示完整的迭代,包括足够的命令调用,以使光标返回到0。N是集合内元素的数量。
使用SCAN命令和与之密切相关的命令SSCAN,HSCAN和ZSCAN以便逐步迭代元素集合。
SCAN迭代当前选择的Redis数据库中的密钥集。
SSCAN迭代Sets类型的元素。
HSCAN迭代Hash类型的字段及其关联的值。
ZSCAN迭代Sorted Set类型的元素及其关联的分数。
由于这些命令允许增量迭代,每个调用仅返回少量元素,因此可以在生产中使用它们,而不会受到诸如KEYS或SMEMBERS之类的命令的不利影响,这些命令在被调用时可能会长时间(甚至几秒钟)阻塞服务器键或元素的大集合。
但是,虽然像SMEMBERS这样的阻塞命令能够在给定的时间内提供Set中所有元素,但是SCAN系列命令仅对返回的元素提供有限保证,因为我们递增迭代的集合可以在迭代过程中更改。
请注意,SCAN,SSCAN,HSCAN和ZSCAN的工作方式都非常相似,因此本文档涵盖了所有四个命令。但是,明显的区别是,对于SSCAN,HSCAN和ZSCAN,第一个参数是保存Set,Hash或Sorted Set值的键的名称。该SCAN命令不需要任何按键名称参数,因为它遍历当前数据库的密钥,所以迭代对象是数据库本身。
扫描基本用法
SCAN是基于游标的迭代器。这意味着在每次调用该命令时,服务器都会返回一个更新的游标,用户需要将该游标用作下一个调用中的游标参数。
游标设置为0时,迭代将开始,服务器返回的游标为0时,迭代将终止。以下是SCAN迭代的示例:
redis 127.0.0.1:6379> scan 0
1) "17"
2) 1) "key:12"
2) "key:8"
3) "key:4"
4) "key:14"
5) "key:16"
6) "key:17"
7) "key:15"
8) "key:10"
9) "key:3"
10) "key:7"
11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
2) "key:18"
3) "key:0"
4) "key:2"
5) "key:19"
6) "key:13"
7) "key:6"
8) "key:9"
9) "key:11"
scan的缺点:
在进行增量式的迭代的时候会出现,在增量式迭代的过程中出现key的改变或者key的增加就会出现key值缺少的情况。(?)