🐼Set 集合介绍
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中元素之间是**⽆序** 的 元素不允许重复。 ⼀个集合中最多可以存储2^31 -1 个元素。Redis 除了支持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集
Redis Set ≈ C++ std::unordered_set,无序、唯一元素、O (1) 时间复杂度的查找 / 添加 / 删除
🐼普通命令
✅SADD
将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。
返回值为你成功添加进set的元素个数
cpp
SADD key member [member ...]
✅SMEMBERS
获取⼀个 set 中的所有元素,注意,元素间的顺序是无序的。
返回值:所有元素的列表。
cpp
SMEMBERS key
✅SISMEMBER
判断⼀个元素在不在 set 中
cpp
SISMEMBER key member
1 表示元素在 set 中。0 表示元素不在 set 中或者 key 不存在。
✅SCARD
获取⼀个 set 的基数(cardinality),即 set 中的元素个数。
cpp
SCARD key
返回值:set 内的元素个数。
✅SPOP
从 set 中删除并返回⼀个或者多个元素。
比如count = n,就随机从set中删除n个元素;count不写,默认随机删除一个
cpp
SPOP key [count]
返回值:返回成功删除的元素
注意,由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即删除元素为随机删除 。
✅SMOVE
将⼀个元素从源 set 取出并放⼊⽬标 set 中。
cpp
SMOVE source destination member
返回值:1 表示移动成功,0 表示失败。
✅SREM
将指定的元素从 set 中删除。
cpp
SREM key member [member ...]
返回值:本次操作删除的元素个数。
下面是一些集合间的操作
✅SINTER
获取给定 set 的交集中的元素
cpp
SINTER key [key ...]
时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
返回值:交集的元素
✅SINTERSTORE
和sinter类似,只不过是获取给定 set 的交集中的元素并保存到⽬标 set中并返回交集的元素个数。
bash
SINTERSTORE destination key [key ...]
✅SUNION
获取给定 set 的并集中的元素。
cpp
SUNION key [key ...]
返回值:并集的元素
SUNIONSTORE和SINTERSTORE类似
✅SDIFF
获取给定 set 的差集中的元素。
注意是,以第一个key为基准的差值,顺序不同,差值不一样
cpp
SDIFF key [key ...]
返回值:差集的元素
SDIFFSTORE的用法同上
🐼set内部编码
集合类型的内部编码有两种:
当集合中的元素都是整数并且元素的个数较小时,Redis 会选⽤ intset 来作为集合的内部实现,从而减少内存的使用
hashtable(哈希表):当集合类型⽆法满足intset 的条件时,比如元素个数过多,或者插入字符串,Redis 会使⽤ hashtable 作为集合的内部实现
🐼使用场景
我们已经学了很多数据类型的使用场景,但万变不离其宗,要抓住其数据类型的特点,定制化使用场景。比如set,就是去重,无序,可以求交集并集差集等...
🏠标签(tag)
例如 A 用户对娱乐、体育板块比较感兴趣,B ⽤⼾对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签的⼈,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助,就是在给不同的用户构造"画像" ,画像画的越好,越能表示用户。 例如⼀个电⼦商务⽹站会对不同标签的用户做不同的产品推荐,不过站在用户的角度,这样是**"窥探了用户的隐私"**
给用户添加标签
cpp
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
给标签添加用户
cpp
sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28
🏠计算用户的共同兴趣标签,比如计算用户的共同好友
利用了交集
cpp
sinter user:1:tags user:2:tags
🏠使用set统计UV
对于一个产品,如何衡量用户的规模,用户量?一个是PV,一个是UV。
PV:用户每次点击访问服务器,就是一个PV操作
UV:每个用户访问服务器,都会产生一个UV,不过,同一个用户点击多次,UV不会增加
主要利用set去重性,根据UV的次数就能知道这个产品服务用户量