集合类型(set)中的每个元素都是不同的,且没有顺序。一个集合类型键可以存储至多 232 −1 个字符串。
集合类型的常用操作是向集合中增加或删除元素、判断某个元素是否存在等,由于集合类型在 Redis 内部是使用值为空的哈希表实现的,因此这些操作的时间复杂度都是 O(1)。
SADD
使用 SADD 命令可以将一个或多个元素添加到集合中,并返回成功添加的元素数量,若某个元素已经存在则会忽略该元素。
SADD key member [member...]
SREM
使用 SREM 命令可以从集合中移除一个或多个已存在的元素,同时返回被移除的元素数量,若指定的元素不存在会忽略该元素。
SREM key member [member...]
SMOVE
SMOVE 命令允许将指定的元素从源集合移动到目标集合。SMOVE 命令在移动操作成功执行时返回 1。
SMOVE source destination member
此命令还有几个细节:
- 若目标集合不存在,会首先创建一个空集合。
- 若源集合不存在指定的元素,则返回 0 表示执行失败。
- 若目标集合存在指定的元素,仍然会将该元素在源集合移除并覆盖目标集合中的元素。
SMEMBERS
通过使用 SMEMBERS 命令可以取得集合包含的所有元素。
SMEMBERS key
返回的元素顺序无法得到保证,因为集合是无序的,若集合中元素很多,慎重使用此命令。
SCARD
SCARD 命令可以返回集合中的元素数量,此命令的时间复杂度是 O(1)。
SCARD key
SISMEMBER
通过使用 SISMEMBER 命令,可以检查给定的元素是否存在于集合当中,若存在返回 1,不存在返回 0。此命令的时间复杂度是 O(1)。
SISMEMBER key memeber
SRANDMEMBER
通过使用 SRANDMEMBER 命令,可以从集合中随机地获取指定数量的元素(不会删除元素)。
SRANDMEMBER key count
针对 count 的不同设置可能有几种处理方法:
- 不设置 count,随机返回一个元素。
- count>0,返回 count 个不重复的元素,当 count 大于集合包含的元素数量时,将返回集合包含的所有元素。
- count<0,返回 abs(count) 个重复的元素。
SPOP
通过使用 SPOP 命令,可以从集合中随机地移除指定数量的元素。
SPOP key count
SPOP 的使用方式和 SRANDMEMBER 一样。
SINTER
SINTER 命令可以计算出给定的所有集合的交集,然后返回这个交集包含的所有元素。
SINTER key [key...]
例如:
redis> sadd set1 1 2 3
(integer) 3
redis> sadd set2 3 4 5
(integer) 3
redis> sinter set1 set2
1) "3"
SINTERSTORE
这个命令可以把给定集合的交集计算结果存储到指定的目标键里面。
SINTERSTORE destination key [key...]
如果给定的目标键已经存在,那么 SINTERSTORE 命令在执行存储操作之前会先删除已有的键。 SINTERSTORE 命令在执行完毕之后会返回被存储的交集元素数量作为返回值。
Redis 还提供了 SUNION、SUNIONSTORE、SDIFF、SDIFFSTORE 分别针对集合的并集和差集运算。
因为对集合执行交集、并集、差集等集合计算需要耗费大量的资源,所以应该尽量使用 *STORE 等命令来存储并重用计算结果,而不要每次都重复进行计算。此外,当集合计算涉及的元素数量非常大时,Redis 服务器在进行计算时可能会被阻塞。这时可以考虑使用 Redis 的复制功能,通过从服务器来执行集合计算任务,从而确保主服务器可以继续处理其他客户端发送的命令请求。
应用场景
共同好友、推荐好友
集合类型可以使用在社交领域中的共同好友、推荐好友业务场景中。
比如用户 A 的好友可以以如下方式存储 user:1:frends 2,3,4。 比如用户 B 的好友可以以如下方式存储 user:2:frends 3,5,7。
通过取交集就可以得到用户 A 和 B 的共同好友。通过取差集可以得到推荐好友。
标签
由于集合不允许重复,所以集合类型十分适合存储文章的标签。
点赞、投票
集合类型十分适合点赞、转发、投票等场景,当用户点赞或者投票就加入到对应的集合中,而且判断用户是否点赞、是否投票、取消点赞、取消投票等操作都很方便。
抽奖
使用 SPOP 命令可以简单的实现一个抽奖系统。