介绍

  • 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在 Redis 内部是使用值为空的散列表实现的,所以这些操作的时间复杂度都是O(1)。

命令

1.增加/删除元素

SADD key member [member]
SREM key member [member]

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

redis> SADD letters a
(integer) 1
redis> SADD letters a b c
(integer) 2

第二条SADD命令的返回值为2是因为元素“a”已经存在,所以实际上只加入了两个元素。
SREM 命令用来从集合中删除一个或多个元素,并返回删除成功的个数。

redis> SREM letters c d 
(integer) 1

由于元素“d”在集合中不存在,所以只删除了一个元素,返回值为 1。

2.获得集合中的所有元素

SMEMBERS key

SMEMBERS 命令会返回集合中的所有元素。

redis> SMEMBERS letters
1) "b"
2) "a"

3.判断元素是否在集合中

SISMEMBER key member

当值存在时返回1,不存在时返回0。

redis> SISMEMBERS letters a
(integer) 1
redis> SISMEMBERS letters d
(integer) 0

4.集合间运算

SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]

SDIFF 命令用来对多个集合执行差集运算。

redis> SADD setA 1 2 3
(integer) 3
redis> SADD setB 2 3 4
(integer) 3
redis> SDIFF setA setB
1) "1"
redis> SDIFF setB setA
1) "4"

SDIFF 命令支持同时传入多个键

redis> SADD setC 2 3 
(integer) 2
redis> SDIFF setA setB setC
1) "1"

计算顺序为:setA - setB 之后的结果 - setC

SINTER 命令用来对多个集合执行交集运算。

redis> SINTER setA setB
1) "2"
2) "3"

SINTER 命令同样支持同时传入多个键。

redis> SINTER setA setB setC
1) "2"
2) "3"

SUNION 命令用来对多个集合执行并集运算。

redis> SUNION setA setB
1) "1"
2) "2"
3) "3"
4) "4"

SUNION 命令同样支持多个键,这里就不赘述了。
5.获得集合中元素个数

SCARD key

例如:

redis> SMEMBERS letters
1) "b"
2) "a"
redis> SCARD letters
(integer) 2

6.进行集合运算并将结果存储

SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]

SDIFFSTORE 命令与 SDIFF命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果存储在 destiantion 键中。
SDIFFSTORE 命令常用于需要进行多步集合运算的场景中,如需要先计算差集再将结果和其他键计算交集。
SINTERSTORE 和 SUNIONSTORE 命令与之类似,不再赘述。
7.随机获得集合中的元素
SRANDMEMBER key [count]
SRANDMEMBER 命令用来随机从集合中获取一个元素。

redis> SRANDMEMBER letters
"a"
redis> SRANDMEMBER letters
"b"
redis> SRANDMEMBER letters
"a"

还可以传递count参数来一次随机获得多个元素,根据count的正负不同,具体表现也不同。
(1)当count为正数时,SRANDMEMBER 会随机从集合里获得 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则 SRANDMEMBER 会返回集合中的全部元素。
(2)当count为负数时,SRANDMEMBER 会随机从集合里获得|count|个的元素,这些元素都有可能相同。

redis> SADD letters c d
(integer) 2

目前letters集合中有 “a”,“b”,“c”,“d”。

redis> SRANDMEMBER letters 2
1) "a"
2) "c"
redis> SRANDMEMBER letters 2
1) "a"
2) "b"
redis> SRANDMEMBER letters 100
1) "b"
2) "a"
3) "c"
4) "d"
redis> SRANDMEMBER letters -2
1) "b"
2) "b"
redis> SRANDMEMBER letters -10
1) "b"    
2) "b"    
3) "a"    
4) "c"    
5) "b"    
6) "a"    
7) "b"    
8) "d"    
9) "b"    
10) "b"

8.从集合中弹出一个元素

SPOP key

因为集合是无序的,所以弹出元素也是随机的。

redis> SPOP letters
"b"
redis> SMEMBERS letters
1) "a"
2) "c"
3) "d"


整理自《Redis 入门指南第二版》。


MurasakiSeiFu
51 声望4 粉丝

德以配位,命以己修。