Redis - 集合
Redis 集合 (Sets)
Section titled “Redis 集合 (Sets)”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:tags1) "redis"2) "mongodb"3) "mysql"(Note: 元素的顺序不保证一致)实际应用场景
Section titled “实际应用场景”- 标签: 如上所示,将一组唯一的标签与一个对象(例如,博客文章、照片或产品)关联起来。
- 独立访客追踪: 使用
SADD将用户 ID 或 IP 地址添加到每日集合中(例如,visitors:2023-10-27)。SCARD可以立即获取当天独立访客的总数。 - 社交图谱: 查找共同点。如果你将每个用户的朋友存储在一个集合中,你可以使用
SINTER来查找两个用户之间的共同朋友。 - 访问控制: 将用户的角色存储在一个集合中。你可以使用
SISMEMBER快速检查用户是否具有特定角色。
关键 Redis 集合命令
Section titled “关键 Redis 集合命令”以下是一些用于操作集合的最常用命令。
| 命令 | 描述 |
|---|---|
| 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。