8.1.6 Set类型与常用命令

Set 是无序且元素唯一的集合,底层使用哈希表(对象字典)存储,适合做去重、集合关系计算与过滤。成员类型为字符串,元素不重复且无序。

原理草图

文章图片

典型应用场景
- 用户标签、兴趣集合
- 去重统计、黑白名单
- 共同好友、共同关注(交集)
- 推荐/差集过滤

常用命令与说明
- SADD key member [member ...]:添加元素到集合,返回新增数量
- SREM key member [member ...]:移除元素,返回移除数量
- SMEMBERS key:返回集合中全部元素(无序)
- SISMEMBER key member:判断元素是否存在,存在返回 1
- SCARD key:返回集合元素数量
- SRANDMEMBER key [count]:随机返回元素,不删除
- SPOP key [count]:随机弹出元素,并删除
- SMOVE source dest member:将元素从源集合移动到目标集合

集合运算命令
- SINTER key [key ...]:交集
- SINTERSTORE dest key [key ...]:交集并存储
- SUNION key [key ...]:并集
- SUNIONSTORE dest key [key ...]:并集并存储
- SDIFF key [key ...]:差集(第一个集合减去其余集合)
- SDIFFSTORE dest key [key ...]:差集并存储


可执行示例:标签与共同关注#

# 1) 连接 Redis(默认本地)
redis-cli -h 127.0.0.1 -p 6379

# 2) 准备两个用户标签集合
SADD user:1:tags ops linux redis
SADD user:2:tags linux kafka docker

# 3) 共同标签(交集)
SINTER user:1:tags user:2:tags
# 预期输出:linux

# 4) user1 独有标签(差集)
SDIFF user:1:tags user:2:tags
# 预期输出:ops redis

# 5) 合并并集并存储到新集合
SUNIONSTORE user:1_2:tags user:1:tags user:2:tags
SMEMBERS user:1_2:tags
# 预期输出:ops linux redis kafka docker(无序)

可执行示例:黑白名单与去重#

# 黑名单
SADD blacklist ip:1.1.1.1 ip:2.2.2.2
SISMEMBER blacklist ip:1.1.1.1
# 预期输出:1(在黑名单中)

# 去重统计:重复插入不增加数量
SADD uniq_ids 1001 1002 1002 1003
SCARD uniq_ids
# 预期输出:3

分批遍历示例(避免阻塞)#

# 使用 SSCAN 分批遍历,适用于大集合
SSCAN user:1_2:tags 0 COUNT 2
# 预期输出:下次游标 + 返回元素数组

排错与常见问题#

  1. SMEMBERS 太慢或阻塞
    - 现象:命令执行时间长、Redis 阻塞其他请求
    - 处理:使用 SSCAN 分批遍历,或在业务端限制集合大小
  2. 集合运算结果过大导致内存压力
    - 现象:SUNIONSTORE / SINTERSTORE 后内存飙升
    - 处理:分批计算、设置结果集合 TTL
    bash SUNIONSTORE tmp:tags user:1:tags user:2:tags EXPIRE tmp:tags 600
  3. 元素“丢失”
    - 现象:SISMEMBER 返回 0
    - 处理:确认 Key 是否过期、是否被 DELSPOP 删除
    bash TTL user:1:tags

练习#

  1. 创建 group:Agroup:B,各插入 5 个用户 ID,计算交集与差集。
  2. 使用 SPOP 随机抽取 2 个元素,验证元素是否从集合中删除。
  3. 使用 SSCAN 分批读取 10 个元素的大集合,观察游标变化。