Redis的过滤器(SCAN)功能

Posted 割肉机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的过滤器(SCAN)功能相关的知识,希望对你有一定的参考价值。

 

在写另一篇文章( link )的时候,涉及到过滤器(filter)功能。以前没有接触过,整理如下。

主要参考这两篇:

http://blog.csdn.net/u011510825/article/details/51859656

http://redis.io/commands/scan

实验如下:

复制代码
$ redis-cli  -h [host] -p 8379
> smembers myset
1) "one"
2) "two"
> sscan myset o*
(error) ERR invalid cursor
> sscan myset 0 match o*
1) "0"
2) 1) "one"
> sscan myset 0 match *
1) "0"
2) 1) "one"
   2) "two"
> sscan myset 0 match * count 1
1) "2"
2) 1) "one"
> sscan myset1 0 match "{\'i\': \'[1-9][0-9][0-9]*\'}"
1) "0"
2) 1) "{\'i\': \'990\', \'i2\': \'991\'}"
复制代码

上面有几点需要解释一下。

1. 获取set的命令需要使用 smember。更多的命令列表参考:

http://www.runoob.com/redis/redis-sets.html

复制代码
Redis 集合命令
下表列出了 Redis 集合基本命令:
序号    命令及描述
1    SADD key member1 [member2] 
向集合添加一个或多个成员
2    SCARD key 
获取集合的成员数
3    SDIFF key1 [key2] 
返回给定所有集合的差集
4    SDIFFSTORE destination key1 [key2] 
返回给定所有集合的差集并存储在 destination 中
5    SINTER key1 [key2] 
返回给定所有集合的交集
6    SINTERSTORE destination key1 [key2] 
返回给定所有集合的交集并存储在 destination 中
7    SISMEMBER key member 
判断 member 元素是否是集合 key 的成员
8    SMEMBERS key 
返回集合中的所有成员
9    SMOVE source destination member 
将 member 元素从 source 集合移动到 destination 集合
10    SPOP key 
移除并返回集合中的一个随机元素
11    SRANDMEMBER key [count] 
返回集合中一个或多个随机数
12    SREM key member1 [member2] 
移除集合中一个或多个成员
13    SUNION key1 [key2] 
返回所有给定集合的并集
14    SUNIONSTORE destination key1 [key2] 
所有给定集合的并集存储在 destination 集合中
15    SSCAN key cursor [MATCH pattern] [COUNT count] 
迭代集合中的元素
复制代码

 

2. 可以看到sscan的返回结果,有两部分,第一部分是一个数字,基本是0,有时候是正数。第二部分是结果。

其实第一部分代表一个游标。scan就是以游标为基础,每次使用scan(包括sscan),以游标0开始,然后命令会返回一个新的游标;如果新的游标不是0,表示遍历还没有结束,要使用新的游标作为参数,继续输入获得后面的结果。

比如下面这个 count 1的时候,遍历没有结束,就会返回非0的游标。后续要使用新的游标来运行命令。

复制代码
> smembers myset
1) "one"
2) "two"
> sscan myset 0 match * count 1
1) "2"
2) 1) "one"
> sscan myset 2 match * count 1
1) "3"
2) 1) "two"
> sscan myset 3 match * count 1
1) "0"
2) (empty list or set)
复制代码

官网的解释可以查看这里:

http://redis.io/commands/scan

 

以上是关于Redis的过滤器(SCAN)功能的主要内容,如果未能解决你的问题,请参考以下文章

Python Redis中Scan遇到问题

redis之Scan

在NODE中使用Redis SCAN

redis中使用SCAN代替KEYS

Redis应用

Jedis中如何使用SCAN命令