集合(set)
Redis 的集合以无序的方式储存多个各不相同的元素。
用户可快速地向集合添加元素,或者从集合里面 删除元素,也可以对多个集合进行集合运算操作,比如计算并集、交集和差集。
添加元素
SADD key element [element ...]
将一个或多个元素添加到 给定的集合里面,已经存在于集合的元素会自 动被忽略,命令返回新添加到集合的元素数量。
redis> SADD friends "peter"
(integer) 1
redis> SADD friends "jack" "tom" "john"
(integer) 3
redis> SADD friends "may" "tom"
(integer) 1
命令的复杂度为 O(N),N 为成功添加的元素数量。
移除元素
SREM key element [element ...]
移除集合中的一个或者多个元素,不存在于集合中的元素会自 动被忽略,命令返回存在并且被移除的元素数量。
redis> SREM friends "peter"
(integer) 1
redis> SREM friends "tom" "john"
(integer) 2
命令的复杂度为 O(N),N 为被移除元素的数量。
检查给定元素是否存在于集合
SISMEMBER key element
检查给定的元素是否存在于集合,存在的 话返回 1 ;如果元素不存在,或者 给定的键不存在,那么返回 0 。
redis> SISMEMBER friends "peter"
(integer) 1
redis> SISMEMBER friends "li lei"
(integer) 0
redis> SISMEMBER NOT-EXISTS-KEY "element"
(integer) 0
命令的复杂度为 O(1) 。
返回集合的大小
SCARD key
返回集合包含的元素数量(也即是集合的基数)。
redis> SCARD friends
(integer) 6
redis> SREM friends "peter" "jack" "tom"
(integer) 3
redis> SCARD friends
(integer) 3
因为 Redis 会储存集合的长度,所以命令的复杂度为 O(1) 。
返回集合包含的所有元素
SMEMBERS key
返回集合包含的所有元素。
redis> SMEMBERS friends
1) "jack"
2) "peter"
3) "may"
4) "tom"
5) "john"
6) "ben"
命令的复杂度为 O(N) ,N 为集合的大小。
当集合的基数比较大时,执行这个命令有可能会㐀成服 务器阻塞,以后会介绍更好的方式来迭代集合中的元素。
集合的无序性质
对于相同的一集元素,同一个集合命令可能会返回不同的 结果。
redis> SADD friends "peter" "jack" "tom" "john" "may" "ben"
(integer) 6
redis> SMEMBERS friends
1) "jack"
2) "peter"
3) "may"
4) "tom"
5) "john"
6) "ben"
redis> SADD another-friends "ben" "may" "john""tom" "jack" "peter"
(integer) 6
redis> SMEMBERS another-friends
1) "may"
2) "ben"
3) "john"
4) "tom"
5) "jack"
6) "peter"
结论:不要使用集合来储存有序的数据。如果想要 储存有序且重复的值,可以使用列表;如果想要储存有序且无重复的值,可以使用有序集合。
从集合里面随机地弹出一个元素
SPOP key
随机地从集合中移除并返回一个元素,复 杂度为 O(1) 。
redis> SADD friends "peter" "jack" "tom" "john" "may" "ben"
(integer) 6
redis> SPOP friends
"may"
redis> SMEMBERS friends
1) "tom"
2) "john"
3) "jack"
4) "peter"
5) "ben"
从集合里面随机地返回元素
SRANDMEMBER key [count]
如果没有给定可选的 count 参数,那么命令随机地返回集合中的一个元素。
如果给定了 count 参数,那么:
• 当 count 为正数,并且少于集合基数 时,命令返回一个包含 count 个元素的数组,数组中的每个元素各不相同。如果 count 大于或等于集合基数,那么命令返回整个集合。
• 当 count 为负数时,命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count 的绝对值。
和 SPOP 不同, SRANDMEMBER 不会移除被返回的元素。
命令的复杂度为 O(N),N 为被返回元素的数量
redis> SADD friends "peter" "jack" "tom" "john" "may" "ben"
(integer) 1
redis> SRANDMEMBER friends # 随机地返回一个元素
"ben"
redis> SRANDMEMBER friends 3 # 随机地返回三个无重复的元素
1) "john"
2) "jack"
3) "peter"
redis> SRANDMEMBER friends -3 # 随机地返回三个可能有重复的元素
1) "may"
2) "peter"
3) "may"
差集运算
SDIFF key [key ...] 计算所有给定集合的差集,并返回结果。
SDIFFSTORE destkey key [key ...] 计算所有给定集合的差集,并将结果储存到 destkey 。
redis> SADD number1 "123" "456" "789"
(integer) 3
redis> SADD number2 "123" "456" "999"
(integer) 3
redis> SDIFF number1 number2
"789"
交集运算
SINTER key [key ...] 计算所有给定集合的交集,并返回结果。
复杂度:O(N * M), N 为给定集合当中基数最小的集合, M 为给定集合的个数。
SINTERSTORE destkey key [key ...] 计算所有给定集合的交集,并将结果储存到 destkey 。
redis> SADD number1 "123" "456" "789"
(integer) 3
redis> SADD number2 "123" "456" "887"
(integer) 3
redis> SINTER number1 number2
1) "123"
2) "456"
并集运算
SUNION key [key ...] 计算所有给定集合的并集,并返回结果。
SUNIONSTORE destkey key [key ...] 计算所有给定集合的并集,并将结果储存到 destkey 。
redis> SADD number1 "123" "456" "789"
(integer) 3
redis> SADD number2 "123" "456" "887"
(integer) 3
redis> SUNION number1 number2
1) "123"
2) "456"
3) "789"
4) "887"