【Redis】Set 集合

article/2025/7/3 12:09:53

文章目录

  • 常用命令
    • sadd
    • smembers
    • sismember
    • scard
    • spop
    • smove
    • srem
  • 集合间操作
    • sinter && sinterstore
    • sunion && sunionstore
    • sdiff && sdiffstore
  • 内部编码
  • 应用场景

在这里插入图片描述

集合类型也是用于存储多个字符串类型的数据结构
集合中元素之间是 1. 无序的 2. 不允许重复的
一个集合最多可以存储 232 - 1 个元素,Redis 的集合支持增删改查操作,和多个集合之间取交集、并集、差集

在这里插入图片描述

常用命令

sadd

将一个或者多个元素添加到 set 中,若添加重复的元素,则无效果

sadd key member [member …]

返回值:本次添加成功的元素个数,重复的元素不计入统计

示例:

127.0.0.1:6379> sadd key1 zhangsan lisi wangwu zhaoliu
(integer) 4
127.0.0.1:6379> sadd key1 zhangsan
(integer) 0

smembers

获取一个 set 中所有的元素,元素之间是无序的

smembers key

返回值:所有元素的列表

示例:

127.0.0.1:6379> smembers key1
1) "wangwu"
2) "zhangsan"
3) "zhaoliu"
4) "lisi"

sismember

判断一个元素是否在该 set 中

sismember key number

返回值:1 表示在,0 表示元素不在或者该 set 不存在

示例:

127.0.0.1:6379> sismember key1 zhangsan
(integer) 1
127.0.0.1:6379> sismember key1 Sam
(integer) 0
127.0.0.1:6379> sismember key2 zhangsan
(integer) 0

scard

获取一个 set 的基数(cardinality),即 set 中元素的个数

scard key

返回值:set 内元素的个数

示例:

127.0.0.1:6379> scard key1
(integer) 4
127.0.0.1:6379> scard key2
(integer) 0

spop

从 set 中删除并返回一个或者多个元素,删除的元素是随机的,源码中就是随机删除

spop key [count]

返回值:删除的元素

示例:

127.0.0.1:6379> smembers key1
1) "three"
2) "two"
3) "one"
4) "wangwu"
5) "zhangsan"
6) "lisi"
7) "zhaoliu"
127.0.0.1:6379> spop key1
"one"
127.0.0.1:6379> spop key1
"two"
127.0.0.1:6379> spop key1
"three"
127.0.0.1:6379> sadd key1 one two three
(integer) 3
127.0.0.1:6379> spop key1
"two"
127.0.0.1:6379> spop key1
"wangwu"
127.0.0.1:6379> spop key1
"one"

smove

将源 set 中的一个元素取出并放到目标 set 中

smove source destination member

返回值:1 表示移动成功,0表示失败

示例:

127.0.0.1:6379> smove key1 key2 zhangsan
(integer) 1
127.0.0.1:6379> smove key1 key2 one
(integer) 0

srem

将指定的元素从 set 中删除

srem key member [member …]

返回值:本次操作删除的元素个数

127.0.0.1:6379> smembers key1
1) "three"
2) "lisi"
3) "zhaoliu"
127.0.0.1:6379> smembers key2
1) "zhangsan"
127.0.0.1:6379> srem key1 three lisi zhangsan
(integer) 2
127.0.0.1:6379> srem key2 one two
(integer) 0

集合间操作

简单介绍一下集合间操作
交集(inter):将两/多个集合中都有元素提取出来
并集(union):将两/多个集合所有的元素提取出来
差集(diff):有顺序差异,sdiff set1 set2 是将 set1 有但 set2 没有的元素提取出来,sdiff set2 set1 则是将 set2 有但 set1 没有的元素提取出来

在这里插入图片描述

sinter && sinterstore

sinter

获取两/多个 set 的交集

sinter key [key …]

返回值:交集的元素,同样是无序的

示例:

127.0.0.1:6379> smembers key1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
127.0.0.1:6379> sinter key1 key2
1) "c"

sinterstore

将获取的交集的元素保存到目标 set 中

sinterstore destination key [key …]

返回值:交集的元素个数

示例:

127.0.0.1:6379> sinter key1 key2
1) "d"
2) "c"
3) "b"
127.0.0.1:6379> sinterstore key3 key1 key2
(integer) 3
127.0.0.1:6379> smembers key3
1) "c"
2) "d"
3) "b"

sunion && sunionstore

sunion

获取两/多个 set 的并集

sunion key [key…]

返回值:并集的元素

示例:

127.0.0.1:6379> smembers key1
1) "d"
2) "c"
3) "a"
4) "b"
127.0.0.1:6379> smembers key2
1) "e"
2) "d"
3) "c"
4) "b"
127.0.0.1:6379> sunion key1 key2
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"

sunionstore

将并集结果保存在目标 set 中

sunionstore destination key [key…]

返回值:并集的元素个数

示例:

127.0.0.1:6379> sunion key1 key2
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"
127.0.0.1:6379> sunion key1 key2 key4
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"
127.0.0.1:6379> sunionstore key4 key1 key2
(integer) 5
127.0.0.1:6379> smembers key4
1) "e"
2) "d"
3) "b"
4) "c"
5) "a"

sdiff && sdiffstore

sdiff

获取集合的差集

sdiff key [key…]

返回值:即只有第一个 set 有,其他 set 没有的元素

示例:

127.0.0.1:6379> sadd key1 a b c d
(integer) 4
127.0.0.1:6379> sadd key2 b c
(integer) 2
127.0.0.1:6379> sadd key3 d
(integer) 1
127.0.0.1:6379> sdiff key1 key2
1) "a"
2) "d"
127.0.0.1:6379> sdiff key1 key2 key3
1) "a"

sdiffstore

将差集的结果保存到目标 set 中

sdiffstore destination key [key…]

返回值:差集的元素个数

示例:

127.0.0.1:6379> sdiff key1 key2 key3
1) "a"
127.0.0.1:6379> sdiffstore key4 key1 key2 key3
(integer) 1
127.0.0.1:6379> smembers key4
1) "a"

在这里插入图片描述

内部编码

集合类型的内部编码有两种:

  • intset(整数集合):当集合的元素都是整数并且元素的个数小于 set-max-intset-entries 时,Redis 采用 intset 作为集合的内部实现,减少内存的使用
  • hashtabel(哈希表):当集合类型无法满足 intset 条件时,Redis 使用 hashtable 作为集合的内部实现

应用场景

集合类型比较典型的使用场景时标签(tag)。例如 A 用户对体育、游戏的内容比较感兴趣,B 用户对新闻、历史感兴趣,这些都是标签。当数据变多后,就可以知道都有什么人有某个标签,他们还有什么其他的共同标签,这些数据对于增强用户体验和用户粘度都非常有帮助。例如电商平台的推送,短视频平台的引流

示例:

  1. 给用户添加标签
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
  1. 给标签添加用户
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

集合间操作
集合所提供的并集、交集、差集操作也可以很好的用于实际。
交集可以用于查看不同用户共有的标签,不同标签共有的用户
并集可以查看一类用户的所有的标签
差集则可以研究不同用户标签的差异化

不允许重复 & 无序

集合没有重复元素,也刚好符合标签的唯一性,便于数据操作。其无序性也体现了标签/爱好的平等


以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述


http://www.hkcw.cn/article/flfZdJvAiX.shtml

相关文章

python打卡训练营打卡记录day43

复习日 作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 进阶:并拆分成多个文件 数据集来源:Flowers Recognition 选择该数据集原因: 中等规模:4242张图片 - 训练快速但足够展示效…

向量空间的练习题目

1.考虑 中的向量x1 和x2 求每一向量的长度 令x3x1x2,求x3的长度,它的长度与x1和x2的和有什么关系? 2.重复练习1,取向量 3.令C为复数集合,定义C上的加法为 (abi)(cdi)(ac)(bd)i 并定义标量乘法为对所有实数a (abi) a bi 证明&…

Android Studio历史版本下载地址汇总

Android Studio 下载文件归档 | Android Developers本页提供了各个 Android Studio 版本的下载归档文件。https://developer.android.google.cn/studio/archive?hlzh-cn

SpringBoot-Thymeleaf

大佬写的真好:Thymeleaf一篇就够了-阿里云开发者社区

序列搜索策略

序列搜索策略 贪心搜索(greedy search) 在大语言模型中, 对于输出序列的每一时间步t′, 我们都将基于贪心搜索从Y中找到具有最高条件概率的词元,即: y t ′ argmax ⁡ y ∈ Y P ( y ∣ y 1 , … , y t ′…

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件

MG影视登录解锁永久VIP会员 v8.0 支持手机电视TV版影视直播软件 MG影视App电视版是一款资源丰富、免费便捷、且专为大屏优化的影视聚合应用,聚合海量资源,畅享电视直播,是您电视盒子和…

【浏览器】无法连接到互联网解决方法

Mac网络连接一切正常(手机连接互联网能正常使用) 但是涉及到网络界面就提示“无法连接到互联网”: 解决办法: 点击左上角→系统设置→网络→→位置→编辑位置→→新增一个即可 正常了!!

【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令

目录 五.#和##运算符 5.1--#运算符 5.2--##运算符 六.命名约定,#undef,命令行定义 6.1--命名约定 6.2--#undef 6.3--命名行定义 七.条件编译 常见的条件编译指令: 1.普通的条件编译: 2.多个分支的条件编译(可以利用条…

数据资产评估进阶:精读资产评估专家指引第9号——数据资产评估指导【附全文阅读】

这篇文档是有关数据资产评估的专业报告,以下是文档中需要关注的重点内容: 1. 评估对象:文档中提到了数据资产评估的评估对象,即被评估数据资产。需要关注被评估数据资产的信息属性、法律属性、价值属性等,以及其特征对…

btstack协议栈---ESP32底层逻辑分析

目录 循环体 循环体中,怎么读取、处理数据 packet_handler 上面各层如何处理数据 谁触发了数据的传输? 硬件相关的数据有4类 循环体 BTStack针对不同的运行环境,抽象出了对应的btstack_run_loop结构体,共成员为: 比如其中的execute成员很重要,它是一个循环,在循…

碳中和新路径:铁电液晶屏如何破解高性能与节能矛盾?

一、显示技术困局:当 “高刷” 遭遇 “高耗” 在元宇宙、电竞产业蓬勃发展的当下,显示设备的刷新率与能耗成为行业痛点。传统液晶受 “边缘场效应” 制约,刷新率长期停滞在 300Hz 以下,动态画面拖影问题显著;同时&…

408考研逐题详解:2009年第27题

2009年第27题 一个分段存储管理系统中,地址长度为 32 位,其中段号占 8 位,则最大段长是( ) A. 2 8 2^8 28B \qquad B. 2 16 2^{16} 216B \qquad C. 2 24 2^{24} 224B \qquad D. 2 32 2^{32} 232B 解析 本题…

ASC格式惯导数据文件转IMR格式文件

我们使用惯导采集数据之后,如果需要用现有软件进行解算,比如POSMind等等,就会涉及到IMR格式的惯导数据文件。而NovAtel Convert转换软件只能将原始DAT格式的文件转成ASCLL文件,因此我自编程实现了ASC格式文件到IMR格式文件的转换。…

电脑为什么换个ip就上不了网了

在日常使用电脑上网时,很多人可能遇到过这样的问题:当IP地址发生变化后,突然就无法连接网络了。当电脑更换IP地址后无法上网,这一现象可能由多种因素导致,涉及网络配置、硬件限制或运营商策略等层面。以下是系统性分析…

动中通天线跟踪性能指标的测试

卫星通信动中通天线包括天线、卫星信号跟踪接收机、GNSS接收机(含天线)、组合导航设备、天线控制器、伺服结构以及其他射频组件等。其中: • GNSS接收机提供系统位置信息; • 组合导航设备提供天线所在平台的方位、俯仰、横滚姿态…

从 GPT 的发展看大模型的演进

这是一个技术爆炸的时代。一起来看看 GPT 诞生后,与BERT 的角逐。 BERT 和 GPT 是基于 Transformer 模型架构的两种不同类型的预训练语言模型。它们之间的角逐可以从 Transformer 的编码解码结构角度来分析。 BERT(Bidirectional Encoder Representatio…

Charles青花瓷抓取外网数据包

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! Charles有一个问题,开启翻墙工具后会发现无法进行抓包,这是需要做额外的配置才可以 首选选择下图中的External Proxy Settings 然后如下…

在考古方向遥遥领先的高校课程建设-250602

解决方案:全栈自学,全栈自研,独立自主。 全文AI…… 每代人的智商和注意力差异是如何出现的-250602-CSDN博客 网络还是有这些内容的: 考古教育之殇:高校课程建设的滞后与困境 在考古学这一承载着人类文明密码与历史记…

K-匿名模型

K-匿名模型是隐私保护领域的一项基础技术,防止通过链接攻击从公开数据中重新识别特定个体。其核心思想是让每个个体在发布的数据中“隐匿于人群”,确保任意一条记录至少与其他K-1条记录在准标识符(Quasi-Identifiers, QIDs)上不可…

BUUCTF[极客大挑战 2019]EasySQL 1题解

[极客大挑战 2019]EasySQL题解 分析解题过程漏洞原理分析明确注入点:尝试万能密码法法一法二 总结 分析 从题目分析,这道题应该与SQL注入有关,启动靶机之后,访问url是一个登录界面,随便输入用户名密码之后&#xff0…