集合
Redis的集合以无序的方式存储多个各不相同的元素。用户可以快速地向集合添加元素,或者从集合里面删除元素,也可以对多个集合进行集合运算操作,比如计算并集、交集和差集。
一、元素操作
1.添加元素
SADD key element [element...]
将一个或多个元素添加到给定的集合里面,已经存在于集合的元素会自动忽略,命令返回新添加到集合的元素的数量。
命令复杂度为O(N),N为成功添加的元素数量。
2.移除元素
SREM key element [element..]
移除集合中的一个或多个元素,不存在于集合中的元素会被自动忽略,命令返回存在并且被移除的元素数量。
命令复杂度为O(N),N为被移除元素的数量。
3.检查给定元素是否存在于集合
SISMEMBER key element
检查给定的元素是否存在于集合,存在的话返回1;如果元素不存在,或者给定的键不存在,那么返回0。
命令复杂度为O(1)。
4.返回集合的大小
SCARD key
返回集合包含的元素数量(也即是集合的基数)。因为Redis会存储集合的长度,所以命令的复杂度为O(1)。
5.返回集合包含的所有元素
SMEMBERS key
返回集合包含的所有元素,N为集合的大小。当集合的基数比较大时,执行这个命令有可能造成服务器阻塞。
6.集合的无序性质
对于相同的集合元素,同一个集合命令可能会返回不同的结果。
注意:不要使用集合来存储有序的数据如果要想存储有序且重复的值,可以使用列表;如果想要存储有序且无重复的值,可以使用之后介绍的有序集合。
7.应用:点赞、喜欢、投票等功能。
8.从集合里面随机弹出一个元素
SPOP key
随机地从集合中移除并返回一个元素,复杂度为O(1)。
9.从集合里面随机地返回元素
SRANDMEMBER key [count]
如果没有给定可选的count参数,那么命令随机地返回集合中的一个元素。如果给定了count参数,那么:当count为正数,并且小雨集合基数时,命令返回一个包含count个参数的数组,数组中的每个元素各不相同。如果count大于或等于集合基数,那么命令返回整个集合。当count为负数时,命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值。和SPOP不同的是,SRANDMEMBER不会移除被返回的元素。命令复杂度为O(N),N为被返回元素的数量。可以用于实现随机抽奖。
二、集合运算操作
1.差集运算
命令 | 作用 | 复杂度 |
SDIFF key [key...] | 计算所有给定集合的差集,并返回结果。 | O(N),N为所有参与差集计算的元素数量之和 |
SDIFFSTORE destkey key [key...] | 计算所有给定集合的差集,并将结果存储到destkey。 | O(N),N为所有参与差集计算的元素数量之和。 |
2.交集运算
命令 | 作用 | 复杂度 |
SINTER key [key...] | 计算所有给定集合的交集,并返回结果。 | O(N),N为所有参与差集计算的元素数量之和 |
SINTERSTORE destkey key [key...] | 计算所有给定集合的交集,并将结果存储到destkey。 | O(N),N为所有参与差集计算的元素数量之和。 |
3.并集运算
命令 | 作用 | 复杂度 |
SUNION key [key...] | 计算所有给定集合的并集,并返回结果。 | O(N),N为所有参与差集计算的元素数量之和 |
SUNIONSTORE destkey key [key...] | 计算所有给定集合的并集,并将结果存储到destkey。 | O(N),N为所有参与差集计算的元素数量之和。 |
集合运算使用场景:比如微博的共同关注功能,商品筛选功能。