Redis基本数据类型:Set

84 阅读3分钟

Set

一、Set 类型概述

Redis 的 Set 是 String 类型的无序集合。它最大的特点是:

  • 元素唯一:集合中的元素不会重复
  • 无序性:元素没有顺序,遍历顺序不固定
  • 支持集合运算:求交集、并集、差集等

Set 中最大的成员数为 2³² - 1(40 多亿个成员)。

二、基本方法

  1. 基本操作 增删查
127.0.0.1:6379> sadd num 1 2 3  #添加一个或或多个元素
(integer) 3
127.0.0.1:6379> sadd num 4
(integer) 1
127.0.0.1:6379> smembers name  #获取value失败
(empty array)
127.0.0.1:6379> smembers num  #获取所有的value
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sadd num 1  #添加相同的元素,失败  **(如果添加多个元素,有一个失败,全部失败)**
(integer) 0
127.0.0.1:6379> srem num 1  #移除元素
(integer) 1
127.0.0.1:6379> smembers num
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> scard num  #查询集合元素数
(integer) 3
127.0.0.1:6379> sismember num 1  #判断1是否是集合的成员
(integer) 0
127.0.0.1:6379> sismember num 2  #判断2是否是集合的成员
(integer) 1
  1. 随机操作
127.0.0.1:6379> srandmember num 1  #在指定集合中返回一个随机数
1) "2"
127.0.0.1:6379> srandmember num 1  
1) "3"
127.0.0.1:6379> srandmember num 2  #在指定集合中返回两个随机数
1) "4"
2) "2"
127.0.0.1:6379> spop num 2  #在指定集合随机踢出两个数
1) "2"
2) "4"
127.0.0.1:6379> smembers num
1) "3"

3. 集合操作(重要)

127.0.0.1:6379> sadd num 1 2 3 4 5 6  #创建两个集合
(integer) 6
127.0.0.1:6379> sadd count 4 5 6 7 8
(integer) 5
127.0.0.1:6379> sinter num count  #返回两个集合的交集
1) "4"
2) "5"
3) "6"
127.0.0.1:6379> sunion num count  #返回两个集合的并集
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
127.0.0.1:6379> sdiff num count  #返回第一个集合与第二个集合不同的元素(差集)
1) "1"
2) "2"
3) "3"

127.0.0.1:6379> sinterstore i num count  #将交集写入i
(integer) 3
127.0.0.1:6379> sunionstore u num count  #将并集写入u
(integer) 8
127.0.0.1:6379> sdiffstore d num count  #将差集写入d
(integer) 3
127.0.0.1:6379> smembers i
1) "4"
2) "5"
3) "6"
127.0.0.1:6379> smembers u
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
127.0.0.1:6379> smembers d
1) "1"
2) "2"
3) "3"
  1. 移动操作
127.0.0.1:6379> smove num count 1 #将元素1从num集合移动到count集合
(integer) 1
127.0.0.1:6379> smembers num
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
127.0.0.1:6379> smembers count
1) "1"
2) "4"
3) "5"
4) "6"
5) "7"
6) "8"

三、内部实现

Set 的底层实现根据元素内容和数量自动选择:

  1. intset(整数集合)

    • 当集合中的元素都是整数,且元素数量较少时使用
    • 内存紧凑,查询效率高
  2. hashtable(哈希表)

    • 当集合包含非整数元素或元素数量较多时使用
    • 每个元素都是哈希表的一个 key,value 为 NULL

四、应用场景

  1. 标签系统:最经典的用法。为内容(文章、商品、视频等)打上多个标签,利用 Set 的自动去重特性确保标签唯一性。例如:SADD article:1001:tags "tech" "programming" "redis"

  2. 社交关系:利用 Set 存储用户的好友列表、关注列表等。通过 SINTER 命令快速计算共同好友,通过 SISMEMBER 检查关系状态。

  3. 抽奖与随机推荐:利用 SPOP 和 SRANDMEMBER 命令实现抽奖系统。SPOP 随机移除并返回中奖者,SRANDMEMBER 随机返回推荐内容但不移除。

  4. 数据去重:处理需要去重的数据集合,如记录已处理的订单 ID、已阅读的文章 ID 等。通过 SADD + SISMEMBER 确保数据不重复处理。

  5. 黑白名单:存储 IP 黑名单、用户黑名单、敏感词库等。通过 SISMEMBER 快速检查某个元素是否在名单中,通过集合运算管理多维度名单。

  6. 兴趣匹配:通过 SINTER 计算多个 Set 的交集,实现用户兴趣匹配、内容推荐等。例如计算用户标签与文章标签的交集来推荐内容。

  7. 权限管理:存储用户的角色集合或权限集合。通过 SISMEMBER 快速验证用户是否拥有某个权限,通过集合运算进行权限的批量管理。