有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
源码地址:https://gitee.com/pearl-organization/study-redis-demo
文章目录
- 1. 前言
- 2. 常用命令
- 2.1 SADD
- 2.2 SCARD
- 2.3 SISMEMBER
- 2.4 SREM
- 2.5 SSCAN
- 2.6 SDIFF
- 2.7 SUNION
- 2.8 SINTER
- 2.10 SRANDMEMBER
 
- 3. 应用场景
- 3.1 随机抽奖
- 3.2 共同关注
- 3.3 可能认识的人
- 3.4 点赞
 
 
1. 前言
Redis Set 数据类型是一种无序集合,它不允许重复的元素,可以类比 Java 中的 HashSet。
2. 常用命令
Set 相关所有命令:
| 命名 | 描述 | 
|---|---|
| SADD | 向集合添加一个或多个成员 | 
| SCARD | 获取集合的成员数 | 
| SDIFF | 返回给定所有集合的差集 | 
| SDIFFSTORE | 返回给定所有集合的差集并存储在 destination中 | 
| SINTER | 返回给定所有集合的交集 | 
| SINTERCARD | 类似于 SINTER,但它不返回结果集,而是只返回结果的基数。返回集合的基数,该基数将由所有给定集合的交集产生 | 
| SINTERSTORE | 返回给定所有集合的交集并存储在 destination中 | 
| SISMEMBER | 判断 member元素是否是集合key的成员 | 
| SMEMBERS | 获取一个集合的所有成员 | 
| SMISMEMBER | 从存储在 key处的集合值中返回一个随机元素 | 
| SMOVE | 将 member元素从source集合移动到destination集合 | 
| SPOP | 移除并返回集合中的一个随机元素 | 
| SRANDMEMBER | 返回集合中一个或多个随机数 | 
| SREM | 移除集合中一个或多个成员 | 
| SSCAN | 迭代集合中的元素 | 
| SUNION | 返回所有给定集合的并集 | 
| SUNIONSTORE | 所有给定集合的并集存储在 destination集合中 | 
2.1 SADD
SADD 命令将一个或多个成员元素加入到集合中,已经存在于集合的成员元素将被忽略。返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素。
注意事项:
- 假如集合 key不存在,则创建一个只包含被添加的元素作为成员的集合。
- 当集合 key不是集合类型时,返回一个错误。
- 在 Redis 2.4版本以前, 只接受单个成员值。
基本语法:
SADD key member [member ...]
示例:
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "Hello"
2) "World"
2.2 SCARD
SCARD 命令返回集合中元素的数量,当集合 key 不存在时,返回 0 。
基本语法:
SCARD key
示例:
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2
2.3 SISMEMBER
SISMEMBER 命令返回存储在 key 中的集合的所有的成员。
注意事项:
- 不存在的集合被视为空集合
- 与运行带有一个参数 key的SINTER有同样的效果。
基本语法:
SMEMBERS key
示例:
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "Hello"
2) "World"
2.4 SREM
SREM 用于在集合中删除指定的元素,返回值为被删除元素个数,不含不存在的元素。
注意事项:
- 如果指定的元素不是集合成员则被忽略。
- 如果集合 key不存在则被视为一个空的集合,该命令返回0。
- 如果key的类型不是一个 Set,则返回ERR WRONGTYPE Operation against a key holding the wrong kind of value错误。
基本语法:
SREM key member [member ...]
示例:
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
redis> SMEMBERS myset
1) "two"
2) "three"
2.5 SSCAN
SSCAN 命令用于遍历集合中键的元素,继承自 SCAN。
基本语法:
SSCAN key cursor [MATCH pattern] [COUNT count]
命令参数:
- cursor:游标。
- pattern:匹配的模式。
- count:指定从数据集里返回多少元素,默认值为- 10。
示例:
> SADD myset1 "Google"
(integer) 1
> SADD myset1 "Redis"
(integer) 1
> SADD myset1 "Taobao"
(integer) 1
> SSCAN myset1 0 match R*
1) "0"
2) 1) "Redis"
2.6 SDIFF
SDIFF 命令返回第一个集合与其他集合之间的差异,也可以认为说第一个集合中独有的元素。不存在的集合 key 将视为空集。
基本语法:
SDIFF key [key ...]
示例:
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"
2.7 SUNION
SUNION 命令用于返回所有给定集合的并集。
基本语法:
SUNION key [key ...]
示例:
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNION key1 key2
1) "b"
2) "c"
3) "a"
4) "d"
5) "e"
2.8 SINTER
SINTER 返回所有给定集合的成员交集。
基本语法:
SINTER key [key ...]
示例:
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTER key1 key2
1) "c"
2.10 SRANDMEMBER
SRANDMEMBER 命令随机返回集合 key 中的一个或多个随机元素。
注意事项:
- 如果 key不存在则返回nil。
- 使用 count参数,则返回一个随机的元素数组,如果key不存在则返回一个空的数组。
基本语法:
SRANDMEMBER key [count]
示例:
redis> SADD myset one two three
(integer) 3
redis> SRANDMEMBER myset
"two"
redis> SRANDMEMBER myset 2
1) "two"
2) "three"
redis> SRANDMEMBER myset -5
1) "one"
2) "three"
3) "two"
4) "one"
5) "two"
3. 应用场景
Set 数据类型除了普通的存储功能外,还提供了交集、并集、差集操作,可用于以下场景:
- 抽奖系统、随机点名
- 共同关注、共同粉丝、共同喜好、共同好友等
- 数据不能重复的场景,例如点赞
- 可能认识的人
3.1 随机抽奖

用户点击参与抽奖时,添加到抽奖集合中:
localhost:0>SADD join_user_set 1
"1"
localhost:0>SADD join_user_set 2
"1"
localhost:0>SADD join_user_set 3
"1"
查看抽奖总参与人数:
localhost:0>SCARD join_user_set
"3"
随机抽取两人(不删除元素):
localhost:0>SRANDMEMBER key 2
随机抽取两人(删除元素):
localhost:0>SRANDMEMBER join_user_set 2
3.2 共同关注

 我的关注:
localhost:0>SADD my_follow_set u1 u2 u3 
"3"
贾乃亮的关注:
localhost:0>SADD jianailiang_follow_set u2 u3 u4
"3"
查看共同关注:
localhost:0>SINTER my_follow_set  jianailiang_follow_set1)  "u2"2)  "u3"
3.3 可能认识的人
在社交平台中,添加好友时,系统会推荐可能认识的人,例如抖音:

 例如快手:
 
一般有以下规则:
- 手机号匹配:社交平台都要求使用手机号注册,在读取你的通讯录后,会根据通讯录手机号查询用户
- 附近的人:通过定位权限获取定理位置,并筛选出附近的人
- 好友差集:计算用户之间的共同好友,如果共同好友超过一定数量,说明两个人是同一个圈子的人,例如同一个班级,两个学生之间的共同好友肯定很多。然后通过计算两人好友之间的差集,进行推荐
- 标签:例如通过相同的兴趣爱好进行推荐
例如,当前我的好友列表:
localhost:0>SADD my_friend_set u1 u2 u3 u5 
"4"
我的好友 u1 的好友列表:
localhost:0>SADD u1_frieng_set  u1 u2 u3 u6
"4"
我和 u1 的共同好友:
localhost:0>SINTER my_friend_set u1_frieng_set1)  "u1"2)  "u2"3)  "u3"
将我有但是 u1 没有的好友推荐给 u1 :
localhost:0>SDIFF u1_frieng_set my_friend_set1)  "u5"
将 u1 有但是我没有的好友推荐给我:
localhost:0>SDIFF  my_friend_set u1_frieng_set1)  "u6"
3.4 点赞

 新增点赞用户:
localhost:0>SADD msg_1 u1 u2
"2"
取消点赞:
localhost:0>SREM msg_1 u1
"1"
查看所有点赞用户:
localhost:0>SMEMBERS msg_11)  "u2"
查看点赞总数:
localhost:0>SCARD msg_1
"1"