Redis - Set 集合

  一、基本了解

      集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中1)元素之间是⽆序 的2)元素不允许重复,如图2-24所⽰。⼀个集合中最多可以存储 32  2 − 1 个元素。Redis除了⽀持 集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实 际开发中解决很多问题。

图2-24集合类型

二、普通命令

2.1、SADD

将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中。

语法:

 SADD key member [member ...]

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:本次添加成功的元素个数。

⽰例:

 redis> SADD myset "Hello"(integer) 1redis> SADD myset "World"(integer) 1redis> SADD myset "World"(integer) 0redis> SMEMBERS myset1) "Hello"2) "World"

2.1、SMEMBERS

获取⼀个set中的所有元素,注意,元素间的顺序是⽆序的。

语法:

SMEMBERS key

命令有效版本:1.0.0之后

时间复杂度:O(N)

返回值:所有元素的列表。

⽰例:

 redis> SADD myset "Hello"(integer) 1redis> SADD myset "World"(integer) 1redis> SMEMBERS myset1) "Hello"2) "World"

2.2、SISMEMBER

判断⼀个元素在不在set中。

语法:

SISMEMBER key member

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在。

⽰例:

 redis> SADD myset "one"(integer) 1redis> SISMEMBER myset "one"(integer) 1redis> SISMEMBER myset "two"(integer) 0

2.3、SCARD

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

语法:

 SCARD key

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:set内的元素个数。

⽰例:

 redis> SADD myset "Hello"(integer) 1redis> SADD myset "World"(integer) 1redis> SCARD myset(integer) 2

2.4、SPOP

从set中删除并返回⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是 未定义⾏为,即可以看作随机的。

语法:

SPOP key [count]

命令有效版本:1.0.0之后

时间复杂度:O(N),n是count

返回值:取出的元素。

⽰例:

 redis> SADD myset "one"(integer) 1redis> SADD myset "two"(integer) 1redis> SADD myset "three"(integer) 1redis> SPOP myset"one"redis> SMEMBERS myset1) "three"2) "two"redis> SADD myset "four"(integer) 1redis> SADD myset "five"(integer) 1redis> SPOP myset 31) "three"2) "four"3) "two"redis> SMEMBERS myset1) "five"

2.4、SMOVE

将⼀个元素从源set取出并放⼊⽬标set中。

语法:

 SMOVE source destination member

命令有效版本:1.0.0之后

时间复杂度:O(1)

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

⽰例:

 redis> SADD myset "one"(integer) 1redis> SADD myset "two"(integer) 1redis> SADD myotherset "three"(integer) 1redis> SMOVE myset myotherset "two"(integer) 1redis> SMEMBERS myset1) "one"redis> SMEMBERS myotherset1) "three"2) "two"

2.5、SREM

将指定的元素从set中删除。

语法:

 SREM key member [member ...]

时间复杂度:O(N),N是要删除的元素个数

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

⽰例:

 redis> SADD myset "one"(integer) 1redis> SADD myset "two"(integer) 1redis> SADD myset "three"(integer) 1redis> SREM myset "one"(integer) 1redis> SREM myset "four"(integer) 0redis> SMEMBERS myset1) "three"2) "two"

三、集合间操作

交集(inter)、并集(union)、差集(diff)的概念如图2-25所⽰。

图2-25集合求交集、并集、差集

3.1、SINTER 

获取给定set的交集中的元素。

语法:

 SINTER key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数

返回值:交集的元素。

⽰例:

 redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SINTER key1 key21) "c"

3.2、SINTERSTORE

获取给定set的交集中的元素并保存到⽬标set中。

语法:

 SINTERSTORE destination key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数

返回值:交集的元素个数。

⽰例:

 redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SINTERSTORE key key1 key2(integer) 1redis> SMEMBERS key1) "c"

3.3、SUNION

获取给定set的并集中的元素。

语法:

SUNION key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素。

⽰例:

 redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SUNION key1 key21) "a"2) "c"3) "e"4) "b"5) "d"

3.4、SUNIONSTORE

获取给定set的并集中的元素并保存到⽬标set中。

语法:

SUNIONSTORE destination key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素个数。

⽰例:

 redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SUNIONSTORE key key1 key2(integer) 5redis> SMEMBERS key1) "a"2) "c"3) "e"4) "b"5) "d"

3.5、SDIFF

获取给定set的差集中的元素。

语法:

SDIFF key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数

返回值:差集的元素

⽰例:

 redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SDIFF key1 key21) "a"2) "b"

3.6、SDIFFSTORE

获取给定set的差集中的元素并保存到⽬标set中。

 SDIFFSTORE destination key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数

返回值:差集的元素个数

⽰例:

 redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SDIFFSTORE key key1 key2(integer) 2redis> SMEMBERS key1) "a"2) "b"

3.7、命令⼩结

表2-6集合类型命令

命令时间复杂度
sadd key element[element...]O(k),k是元素个数
srem key element[element...]O(k),k是元素个数
scard keyO(1)
sismember key elementO(1)
srandmember key[count]O(n),n是count
spop key[count]O(n),n是count
smembers keyO(k),k是元素个数
sinter key[key...]  sitnerstoreO(m*k),k是⼏个集合中元素最⼩的个数,m是键个 数
sunion key[key...]  sunionstoreO(k),k是多个集合的元素个数总和
sdiff key[key...]  sdiffstoreO(k),k是多个集合的元素个数总和

四、内部编码

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

  • intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries配置 (默认512个)时,Redis会选⽤intset来作为集合的内部实现,从⽽减少内存的使⽤。
  • hashtable(哈希表):当集合类型⽆法满⾜intset的条件时,Redis会使⽤hashtable作为集合 的内部实现。

1)当元素个数较少并且都为整数时,内部编码为intset:

 127.0.0.1:6379> sadd setkey 1 2 3 4(integer) 4127.0.0.1:6379> object encoding setkey"intset"

2)当元素个数超过512个,内部编码为hashtable:

 127.0.0.1:6379> sadd setkey 1 2 3 4(integer) 513127.0.0.1:6379> object encoding setkey"hashtable"

3)当存在元素不是整数时,内部编码为hashtable:

 127.0.0.1:6379> sadd setkey a(integer) 1127.0.0.1:6379> object encoding setkey"hashtable"

五、使⽤场景

        集合类型⽐较典型的使⽤场景是标签(tag)。例如A⽤⼾对娱乐、体育板块⽐较感兴趣,B⽤⼾ 对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签 的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助。例如⼀个 电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐。

下⾯的演⽰通过集合类型来实现标签的若⼲功能。

1)给⽤⼾添加标签

 sadd user:1:tags tag1 tag2 tag5sadd user:2:tags tag2 tag3 tag5...sadd user:k:tags tag1 tag2 tag4

2)给标签添加⽤⼾

 sadd tag1:users user:1 user:3sadd tag2:users user:1 user:2 user:3...sadd tagk:users user:1 user:4 user:9 user:28

3)删除⽤⼾下的标签

 srem user:1:tags tag1 tag5...

4)删除标签下的⽤⼾

 srem tag1:users user:1srem tag5:users user:1...

5)计算⽤⼾的共同兴趣标签

sinter user:1:tags user:2:tags

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6780.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java教学辅助:SpringBoot平台实战技巧

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

Codeforces Round 970(Div. 3) (预处理后缀, 一道适合py的题)

F. Sakurakos Box 传送门:Problem - 2008F - Codeforces Sakurako has a box with nn balls. Each ball has its value. She wants to bet with her friend that if the friend randomly picks two balls from the box (it could be two distinct balls, but they…

OpenDroneMap Webodm

OpenDroneMap & Webodm OpenDroneMap Webodm 开源无人机航拍系列图像及其它系列图像三维重建软件。很棒的开源无人机测绘软件OpenDroneMap,从航拍图像生成精确的地图、高程模型、3D 模型和点云。 应用领域 Mapping & Surveying 测绘和测量 从图像测量获得高精度的可…

Github 2024-11-02 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-11-02统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目2Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero Genera…

前端八股文(四)计网 持续更新中。。。

计网相关面试题 1.http缓存的方式 缓存是为了重复使用而被存储的,可以减少浏览器和服务器之间通信的次数、降低网络延迟、加速页面加载、提高用户体验性等。不但能使网页打开速度更快,还能减少服务器的压力。 浏览器缓存策略: 强缓存&…

项目一:使用 Spring + SpringMVC + Mybatis + lombok 实现网络五子棋

一:系统展示: 二:约定前后端接口 2.1 登陆 登陆请求: GET /login HTTP/1.1 Content-Type: application/x-www-form-urlencodedusernamezhangsan&password123登陆响应: 正常对象:正常对象会在数据库中存储&…

vue 插槽

参考文档 插槽 Slots | Vue.js 1. 基本概念 Vue的插槽&#xff08;slot&#xff09;&#xff0c;简单来说&#xff0c;就是一种 定义在组件中的 “占位符”。用于实现现组件的内容分发和复用。如下&#xff0c;是一个简单的默认插槽&#xff1a; <!-- Parent.vue --> &…

信息流不同行业账户流量池有区别吗?

在投放过程中&#xff0c;我们经常遇到这么一个问题&#xff0c;不同行业账户投放&#xff0c;流量池会有区别嘛&#xff1f;我认为是有的&#xff0c;那么对于我们而言&#xff0c;怎么样才能利用好媒体对于流量池的划分效果&#xff0c;可以从以下几个方面来进行考虑&#xf…

[Tex] Ubuntu 搭建 TexWork

更新软件库 打开终端&#xff1a; sudo apt --update sudo apt --upgrade 安装 texlive 完整版与 TexWorks 界面 sudo apt install texlive-full sudo apt install texworks

从0开始深度学习(26)——汇聚层/池化层

池化层通过减少特征图的尺寸来降低计算量和参数数量&#xff0c;同时增加模型的平移不变性和鲁棒性。汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。 1 最大汇聚层、平均汇聚层 汇聚层和卷积核一样&#xff0c;是在输入图片上进行滑动计算&#xff0c;但是不同于卷积层的…

地图带你看三山五岳-基于Leaflet的重点旅游专题实现

目录 前言 一、关于三山五岳 1、三山五岳简介 2、位置信息检索 二、使用Leaflet进行WebGIS标注 1、基础数据准备 2、点位标绘 三、实际效果 1、整体效果 2、东岳泰山 3、西岳华山 4、南岳衡山 5、北岳恒山 6、 中岳嵩山 四、总结 前言 在信息技术飞速发展的今…

营销邮件策略:提升打开率和转化率的技巧!

营销邮件的发送技巧有哪些&#xff1f;如何提高营销邮件召唤力&#xff1f; 随着邮件数量的激增&#xff0c;如何确保您的营销邮件能够脱颖而出&#xff0c;提升打开率和转化率&#xff0c;成为了每个营销人员必须面对的挑战。MailBing将深入探讨一系列有效的营销邮件策略&…

libaom 源码分析:帧间运动矢量预测

AV1 帧间运动矢量预测原理 运动矢量可以被相邻块预测,这些相邻块可以是空域相邻块,或位于参考帧中的时域相邻块;通过检查所有这些块,将确定一组运动矢量预测器,并用于编码运动矢量信息。空域运动矢量预测 两组空域相邻块可以被利用寻找空域 MV 预测器,第一组包括当前块的…

轮播图【HTML+CSS+JavaScript】

给大家分享一个很好看的轮播图&#xff0c;这个也是之前看到别人写的效果感觉很好看&#xff0c;所以后面也自己实现了一下&#xff0c;在这里分享给大家&#xff0c;希望大家也可以有所收获 轮播图效果&#xff1a; 视频效果有点浑浊&#xff0c;大家凑合着看&#xff0c;大家…

OneRestore: A Universal Restoration Framework for Composite Degradation 论文阅读笔记

这是武汉大学一作单位的一篇发表在ECCV2024上的论文&#xff0c;文章代码开源&#xff0c;文章首页图如下所示&#xff0c;做混合图像干扰去除&#xff0c;还能分别去除&#xff0c;看起来很牛逼。文章是少见的做混合图像干扰去除的&#xff0c;不过可惜只包含了3种degradation…

基于Springboot的任务发布平台设计与实现(源码齐全+调试)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

centos7 kafka高可用集群安装及测试

前言 用三台虚拟机centos7 搭建高可用集群&#xff0c;及测试方法 高可用搭建的方法&#xff0c;参考&#xff1a;https://blog.csdn.net/u011197085/article/details/134070318 高可用搭建 1、安装配置zookeeper集群 下载zookeeper 注&#xff1a;zookeeper链接如果失效&a…

30条勒索病毒处置原则

当前&#xff0c;勒索病毒在全球范围内肆虐&#xff0c;成为企业数据资产安全的头号威胁。这些狡猾的恶意软件&#xff0c;如同网络空间中的幽灵&#xff0c;不断寻找并利用系统的漏洞&#xff0c;通过加密数据或窃取敏感信息&#xff0c;向企业索取高额赎金。一旦感染&#xf…

推荐一款业内领先的建模工具:SAP PowerDesigner

SAP PowerDesigner是一款业内领先的建模工具&#xff0c;帮助您改进商务智能&#xff0c;打造更卓越的信息架构。通过该软件的元数据管理功能&#xff0c;可以构建关键信息资产的 360 度全方位视图&#xff0c;从而使数据管理、BI、数据集成和数据整合工作大获裨益。其分析功能…

6本SCI/SSCI被解除「On Hold」, 重新回归, 单位如何认定?还能投吗?

【SciencePub学术】截止至2024年10月&#xff0c;被WOS数据标记的on hold 期刊&#xff0c;共计25本&#xff0c;其中已有6本解除on hold, 重回SCI,SSCI。今天小编就带大家盘点这些“出狱”期刊情况&#xff0c;分析一下这些期刊是否还能投&#xff0c;值得投&#xff1f; 01In…