Set
一、Set 类型概述
Redis 的 Set 是 String 类型的无序集合。它最大的特点是:
- 元素唯一:集合中的元素不会重复
- 无序性:元素没有顺序,遍历顺序不固定
- 支持集合运算:求交集、并集、差集等
Set 中最大的成员数为 2³² - 1(40 多亿个成员)。
二、基本方法
- 基本操作 增删查
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
- 随机操作
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"
- 移动操作
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 的底层实现根据元素内容和数量自动选择:
-
intset(整数集合) :- 当集合中的元素都是整数,且元素数量较少时使用
- 内存紧凑,查询效率高
-
hashtable(哈希表) :- 当集合包含非整数元素或元素数量较多时使用
- 每个元素都是哈希表的一个 key,value 为 NULL
四、应用场景
-
标签系统:最经典的用法。为内容(文章、商品、视频等)打上多个标签,利用 Set 的自动去重特性确保标签唯一性。例如:
SADD article:1001:tags "tech" "programming" "redis"。 -
社交关系:利用 Set 存储用户的好友列表、关注列表等。通过
SINTER命令快速计算共同好友,通过SISMEMBER检查关系状态。 -
抽奖与随机推荐:利用
SPOP和SRANDMEMBER命令实现抽奖系统。SPOP随机移除并返回中奖者,SRANDMEMBER随机返回推荐内容但不移除。 -
数据去重:处理需要去重的数据集合,如记录已处理的订单 ID、已阅读的文章 ID 等。通过
SADD+SISMEMBER确保数据不重复处理。 -
黑白名单:存储 IP 黑名单、用户黑名单、敏感词库等。通过
SISMEMBER快速检查某个元素是否在名单中,通过集合运算管理多维度名单。 -
兴趣匹配:通过
SINTER计算多个 Set 的交集,实现用户兴趣匹配、内容推荐等。例如计算用户标签与文章标签的交集来推荐内容。 -
权限管理:存储用户的角色集合或权限集合。通过
SISMEMBER快速验证用户是否拥有某个权限,通过集合运算进行权限的批量管理。