Skip to content

Redis Set 相关指令

Redis的Set类型是一种无序且唯一元素集合,基于高效的数据结构实现,支持快速的成员检测、集合运算及随机操作。

  1. 底层实现
    • intset(整数集合):当元素全为整数且数量较少时,Redis使用紧凑的intset存储,节省内存。
    • hashtable(哈希表):默认实现方式,元素以哈希表的键存储(值为NULL),保证唯一性并支持快速查找。
  2. 自动转换机制
    • 当元素数量超过set-max-intset-entries配置(默认512)或包含非整数元素时,自动转换为hashtable
  1. 无序且唯一
    元素无顺序,且自动去重,适合需要唯一值的场景(如标签、用户ID集合)。
  2. 高效集合运算
    支持交集(SINTER)并集(SUNION)差集(SDIFF),时间复杂度为O(N),适用于关联数据分析。
  3. 快速成员检测
    判断元素是否存在(SISMEMBER)的时间复杂度为O(1),适合高频查询场景。
  4. 随机操作支持
    • SPOP:随机移除并返回元素(如抽奖)。
    • SRANDMEMBER:随机获取元素但不删除。
指令作用示例时间复杂度
1. SADD添加元素SADD tags "redis" "db"O(1) 每元素
2. SREM删除元素SREM tags "db"O(1) 每元素
3. SISMEMBER判断元素是否存在SISMEMBER tags "redis"O(1)
4. SMEMBERS获取所有元素SMEMBERS tagsO(N)
5. SCARD获取元素数量SCARD tagsO(1)
6. SPOP随机移除并返回元素SPOP tags 2(移除2个)O(1) 每元素
7. SINTER多集合交集SINTER set1 set2O(N*M)
8. SUNION多集合并集SUNION set1 set2O(N)
9. SDIFF多集合差集(set1 - set2)SDIFF set1 set2O(N)
10. SUNIONSTORE存储并集结果SUNIONSTORE result set1 set2O(N)
11. SMOVE移动元素到另一集合SMOVE src dst "redis"O(1)
  1. 去重存储
SADD user:1001:visited_pages "home" "product/123"

记录用户唯一行为(如一天内访问的页面ID)。

  1. 标签系统
SADD user:1001:tags "tech" "coding"
SADD user:1002:tags "tech" "design"
SINTER user:1001:tags user:1002:tags # 返回共同标签 ["tech"]

用户标签管理,快速查找共同兴趣。

  1. 抽奖/随机推荐
SADD lottery_users "user1" "user2" "user3"
SPOP lottery_users 1 # 随机选1名中奖者

利用SPOP实现公平抽奖,或SRANDMEMBER随机展示内容。

  1. 社交关系
SADD user:A:followings "user:B" "user:C"
SADD user:B:followings "user:C" "user:D"
SINTER user:A:followings user:B:followings # 共同关注 ["user:C"]

存储用户关注列表,计算共同关注。

  1. 黑白名单控制
SADD allowed_ips "192.168.1.1" "10.0.0.2"
SISMEMBER allowed_ips "10.0.0.2" # 返回1(存在)

快速验证IP或用户是否在允许/禁止列表中。

注意事项

  1. 无序性限制
    Set无法按插入顺序访问元素,需顺序操作时应改用List或Sorted Set。
  2. 大集合性能
    • SMEMBERS获取全部元素时,若集合过大(如百万级)可能阻塞服务,建议用SSCAN分批遍历。
    • 集合运算(如SINTER)在数据量大时消耗较高,建议在从节点执行或拆分集合。
  3. 内存优化
    尽量使用整数元素(触发intset存储),或通过分片(如按哈希取模拆分为多个Set)降低单个集合大小。
  4. 去重与更新
    Set自动去重,但无法存储关联值(如分数),需扩展数据模型时可结合Hash或Sorted Set。

通过合理利用Redis Set的特性,可高效实现去重、关联计算和随机化处理,尤其适合社交网络、实时统计等场景。