标准 专业
多元 极客

Redis实验室(4)——常用命令——集合

集合

Redis的集合中的元素不允许重复,并且没有顺序,一个集合类型的键可容纳2^32-1个字符串。
集合和列表的区别如下所示:

  集合类型 列表类型
存储大小 <2^32-1 <2^32-1个
有序性
唯一性

SADD key [member…]

SADD命令用来向集合中添加一个或多个元素,如果键不存在则会自动创建,因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素,返回值是成功加入元素的个数,示例如下:

127.0.0.1:6379> SADD sunshine java python shell
(integer) 3
127.0.0.1:6379> SADD sunshine java php
(integer) 1

SREM key [member…]用来从集合中删除一个或多个元素,返回值是删除成功的元素个数,示例如下:

127.0.0.1:6379> SREM sunshine php shell
(integer) 2
127.0.0.1:6379> SREM sunshine php python
(integer) 1

SMEMBERS key

SMEMBERS key用于获得集合中所有的元素,示例如下:

127.0.0.1:6379> SMEMBERS sunshine
1) "shell"
2) "java"
3) "python"

SISMEMBER key member

SISMEMBER key member用于判断一个元素是否在集合中,时间复杂度是O(1),若存在则返回1,不存在返回0,示例如下:

127.0.0.1:6379> SISMEMBER sunshine java
(integer) 1
127.0.0.1:6379> SISMEMBER sunshine fool
(integer) 0

集合运算

SDIFF、SINTER和SUNION三个命令都是用来进行多个集合间的运算的。

SDIFF命令用来对多个集合进行差集运算,代表所有属于A但不属于B的元素构成的集合,该命令的使用方法如下:

127.0.0.1:6379> SADD A 1 2 3
(integer) 3
127.0.0.1:6379> SADD B 3 4 5
(integer) 3
127.0.0.1:6379> SDIFF A B
1) "1"
2) "2"
127.0.0.1:6379> SDIFF B A
1) "4"
2) "5"

SDIFF命令支持同时传入多个键,例如:

127.0.0.1:6379> SADD C 1 3 5
(integer) 3
127.0.0.1:6379> SDIFF A B C
1) "2"

计算顺序是先计算A和B的差集,再计算前面的结果与C的差集。

SINTER命令用来对多个集合执行交集运算,代表所有属于A且属于B的元素构成的集合,SINTER命令示例如下:

127.0.0.1:6379> SINTER A B C
1) "3"

SUNION命令用来对多个集合执行并集运算,代表所有属于A或所有属于B的元素构成的集合,SUNION命令示例如下:

127.0.0.1:6379> SUNION A B C
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

SMEMBERS命令用来查看集合中所有的元素,那么SCARD命令用来获得集合中所有元素的个数,SCARD命令示例如下:

127.0.0.1:6379> SCARD A
(integer) 3

SDIFF、SINTER和SUNION命令用来求交并集,但是得出是结果,怎样才能将计算结果声明到一个新的键中呢?

这里有三个拓展命令:SDIFFSTORE、SINTERSTORE和SUNIONSTORE。命令示例如下:

127.0.0.1:6379> SDIFFSTORE diffset A B C
(integer) 1
127.0.0.1:6379> SINTERSTORE interset A B C
(integer) 1
127.0.0.1:6379> SUNIONSTORE unionset A B C
(integer) 5

命令的区别在于,一个是返回直接结果,另一个是将结果返回到一个声明的键中。

SRANDMEMBER key [count]命令用来随机从集合中获取一个或多个元素,数量由[count]数值决定,SRANDMEMBER示例如下:

127.0.0.1:6379> SRANDMEMBER unionset 1
1) "3"
127.0.0.1:6379> SRANDMEMBER unionset 3
1) "2"
2) "5"
3) "4"

这里,[count]值不同,具体表现形式如下:

  1. 当count为正数时,SRANDMEMBER会随机从集合中获得count个不重复的元素,如果count的值大于集合中元素总数,SRANDMEMBER会返回集合中的全部元素。
  2. 当count为负数时,SRANDMEMBER会随机从集合里获得|count|个数的元素,这些元素有可能相同。
    经验证,count应该为非零整数,当count=0时,结果如下所示:
127.0.0.1:6379> SRANDMEMBER unionset 0
(empty list or set)

SPOP key,前面讲的LPOP命令是从列表左边弹出一个元素(返回元素的值并删除),SPOP命令与其类似,但由于集合类型的元素是无序的,所以该命令会随机从集合中弹出一个元素,SPOP命令示例如下:

127.0.0.1:6379> SPOP unionset
"4"
127.0.0.1:6379> SPOP unionset
"3"
127.0.0.1:6379> SPOP unionset
"1"

 

赞(1) 投币

评论 抢沙发

慕勋的实验室慕勋的研究院

码字不容易,路过请投币

支付宝扫一扫

微信扫一扫