介绍
- 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在 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 入门指南第二版》。