集合增删是什么
集合是无序且自动去重的字符串容器:添加成员时重复值不会报错,只影响返回值;删除成员返回实际删除的数量。这两个返回值很适合做幂等判断——添加返回一说明是首次进入,删除返回一说明确实删掉了。集合还支持交并差运算,标签、关系与去重统计都用得上。
基本信息
| 用途 | 集合成员的增删与判断 |
|---|---|
| 语法 | 添加 键 成员 [成员 ...] / 删除 键 成员 [成员 ...] |
| 返回值 | 实际新增或实际删除的个数 |
| 成员性质 | 二进制安全字符串,自动去重 |
| 无序性 | 成员没有顺序,不能按下标取 |
| 相关命令 | 判断存在、统计数量、取全部成员、集合运算 |
典型使用场景
- 文章或商品的标签集合
- 用户关注列表与粉丝列表
- 去重统计:同一用户重复提交只计一次
- 幂等控制:添加返回一表示首次进入
- 抽奖与筛选:从集合中随机取成员
- 交集运算:找出同时满足多个条件的目标集合
示例
示例
SADD tags:post1 redis mysql redis # 返回 2,重复的 redis 只计一次
SADD tags:post1 cache # 返回 1
SMEMBERS tags:post1 # 返回全部成员,顺序不保证
SREM tags:post1 mysql # 返回 1,实际删除了一个成员
SREM tags:post1 nope # 返回 0,成员本来就不存在
SISMEMBER tags:post1 redis # 判断单个成员是否存在
SCARD tags:post1 # 统计成员数量命令对照
| 命令 | 作用 | 返回 |
|---|---|---|
| 添加 | 添加一个或多个成员 | 实际新增个数 |
| 删除 | 删除指定成员 | 实际删除个数 |
| 单成员判断 | 判断成员是否存在 | 存在返回 1 |
| 统计数量 | 成员总数 | 集合大小 |
| 取全部成员 | 返回所有成员 | 无序,元素多时慎用 |
| 交集 | 多个集合的共同成员 | 结果集合 |
| 并集 | 多个集合的全部成员去重 | 结果集合 |
| 差集 | 只在第一个集合中的成员 | 结果集合 |
成员是二进制安全的字符串,数字与文本都能存;用集合做去重队列时,添加返回一才表示首次进入,可以据此做幂等处理。
集合本身无序,成员没有下标;需要按顺序读取的场景应改用列表或有序集合,而不是取出全部成员再在应用层排序。
一次取全部成员在大集合上会形成大响应,既占带宽也阻塞实例;判断单个成员是否存在要用专用命令,不要取全部再遍历。
集合使用清单
- 判断成员存在用专用命令,不要读全量再遍历
- 集合数量纳入监控,异常增长说明缺少清理
- 需要顺序时换用列表或有序集合
- 用于去重时依赖返回值判断是否首次进入
- 交并差运算在集合规模大时要评估耗时
- 临时集合要设置过期,避免长期占用内存
集合的成员是不可变的字符串,修改成员只能先删除再添加:需要携带额外属性时应改用哈希或有序集合,而不是把属性拼进成员名再反复维护。
集合规模上千之后,取全部成员与集合运算的耗时都会明显上升;面向用户的去重队列建议配合过期时间与定期清理,让集合始终维持在可预期的规模。