【Redis】Set 集合

🐼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的次数就能知道这个产品服务用户量

相关推荐
李慕婉学姐3 分钟前
Springboot旅游景点管理系统2fj40iq6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
早日退休!!!9 分钟前
Roofline模型核心原理:延迟、吞吐与并发的底层逻辑
大数据·网络·数据库
砚边数影14 分钟前
KingbaseES基础(二):SQL进阶 —— 批量插入/查询 AI 样本数据实战
java·数据库·人工智能·sql·ai
霖霖总总15 分钟前
[小技巧35]深入 InnoDB 的 LRU 机制:从原理到调优
数据库·mysql·性能优化
Coder_Boy_27 分钟前
基于SpringAI的在线考试系统-考试系统DDD(领域驱动设计)实现步骤详解(2)
java·前端·数据库·人工智能·spring boot
风行無痕1 小时前
MySQL 8.4 数据库修改字段长度的过程
数据库·mysql
難釋懷1 小时前
Redis命令-Hash命令
数据库·redis·哈希算法
難釋懷1 小时前
Redis命令-List命令
数据库·redis·list
zqmattack1 小时前
SQL sever根据身份证判断性别函数
java·数据库·sql