Skip to content

Redis - 集合

Redis 集合(Sets)是无序的唯一字符串集合。可以将其视为数学上的集合:一个元素在集合中只能出现一次。它们在处理唯一性、成员测试以及基于集合的逻辑(如并集和交集)等任务时效率极高。

集合的关键优势在于添加、删除和检查元素是否存在都是非常快的 O(1) 操作(常数时间,与集合大小无关)。一个集合中成员的最大数量是 2^32 - 1(超过 40 亿)。

让我们使用一个集合来存储博客文章的标签。请注意,第二次添加 mysql 不会产生任何效果。

> SADD post:1:tags redis
(integer) 1 # 输出为 1,因为添加了一个新元素。
> SADD post:1:tags mongodb
(integer) 1
> SADD post:1:tags mysql
(integer) 1
> SADD post:1:tags mysql
(integer) 0 # 输出为 0,因为 'mysql' 已经存在于集合中。
> SMEMBERS post:1:tags
1) "redis"
2) "mongodb"
3) "mysql"
(Note: 元素的顺序不保证一致)
  • 标签: 如上所示,将一组唯一的标签与一个对象(例如,博客文章、照片或产品)关联起来。
  • 独立访客追踪: 使用 SADD 将用户 ID 或 IP 地址添加到每日集合中(例如,visitors:2023-10-27)。SCARD 可以立即获取当天独立访客的总数。
  • 社交图谱: 查找共同点。如果你将每个用户的朋友存储在一个集合中,你可以使用 SINTER 来查找两个用户之间的共同朋友。
  • 访问控制: 将用户的角色存储在一个集合中。你可以使用 SISMEMBER 快速检查用户是否具有特定角色。

以下是一些用于操作集合的最常用命令。

命令描述
SADD key member [member …]向集合添加一个或多个成员。返回成功添加的新成员数量。
SISMEMBER key member如果成员存在于集合中,则返回 1;否则返回 0。这是检查成员是否存在的最完美方式。
SMEMBERS key返回集合中的所有成员。注意:对于非常大的集合可能会很慢。
SCARD key返回集合中的成员数量(即其基数)。
SREM key member [member …]从集合中移除一个或多个成员。
SPOP key [count]从集合中移除并返回一个或多个随机成员。
SRANDMEMBER key [count]返回一个或多个随机成员,但不会将其移除。
SINTER key [key …]返回多个集合的交集(所有集合中共同的元素)。
SUNION key [key …]返回多个集合的并集(所有集合中所有唯一的元素)。
SDIFF key [key …]返回第一个集合与后续集合之间的差集。
SSCAN key cursor [MATCH …]安全地遍历集合成员而不会阻塞服务器。这是读取大型集合所有成员的推荐方式。

虽然单个元素的操作是 O(1),但对多个集合进行操作的命令,如 SINTER、SUNION 和 SDIFF,其计算复杂度与集合中元素的总数成正比。在使用这些命令处理非常大的集合时请谨慎。在生产环境中,对于检索所有成员,推荐使用非阻塞的 SSCAN,而非阻塞的 SMEMBERS。