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

相关推荐
bjzhang752 小时前
C#操作SQLite数据库
数据库·sqlite·c#
hans汉斯2 小时前
嵌入式操作系统技术发展趋势
大数据·数据库·物联网·rust·云计算·嵌入式实时数据库·汉斯出版社
Coder_Boy_3 小时前
Spring 核心思想与企业级最佳特性(实践级)事务相关
java·数据库·spring
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue宠物寄养系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计·宠物
一 乐3 小时前
校园实验室|基于springboot + vue校园实验室管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
坚定信念,勇往无前3 小时前
mongodb备份的脚本
数据库·mongodb
杨忆4 小时前
构建自己的开发工作台MFC
数据库·c++·mfc
阿巴~阿巴~4 小时前
告别命令行:Navicat可视化操作数据库(附安装使用教程)
服务器·数据库·mysql·navicat·可视化操作数据库
zhangyifang_0095 小时前
MySQL中实现“小计”与“合计”
数据库·mysql