Redis(六) Set集合类型

news2024/10/6 22:34:28

在这里插入图片描述

文章目录

  • 前言
  • 命令
    • SADD
    • SMEMBERS
    • SISMEMBER
    • SCARD
    • SPOP
    • SMOVE
    • SREM
    • 集合间操作
      • SINTER
      • SINTERSTORE
      • SUNION
      • SUNIONSTORE
      • SDIFF
      • SDIFFSTORE
    • 命令小结
  • 内部编码
  • 使用场景

前言

集合类型也是保存多个字符串类型的元素的,和列表类型不同的是,set集合类型中的元素是无序的且集合中的元素是不允许出现重复的,一个集合中最多可以存储 2^32-1 个元素。

命令

SADD

SADD 命令将一个或者多个元素添加到集合中,如果集合不存在则会先创建出一个集合然后再添加元素。注意:重复的元素无法添加到一个集合中。SADD key member[member...]

时间复杂度:O(1)
返回值:本次操作添加成功的元素的个数

127.0.0.1:6379> sadd key 1
(integer) 1
127.0.0.1:6379> sadd key 2 2 3 4 #当向set中添加重复元素的时候,是无法成功添加的,set中保证每一个元素只存在一个
(integer) 3

SMEMBERS

SMEMBERS 命令获取一个 set 中的所有元素(元素间的顺序是无序的)SMEMBERS key

时间复杂度:O(N),N为 set 中元素个数
返回值:set 中的所有元素

127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> smembers key # 可以看到set中元素的顺序和我们插入的顺序是不同的
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"

SISMEMBER

SISMEMBER 命令判断一个元素是否在 set 中。SISMEMBER key member

时间复杂度:O(1)
返回值:1表示该元素在set中,0表示该元素不在set中

127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> sismember key 1
(integer) 1
127.0.0.1:6379> sismember key 10
(integer) 0

SCARD

SCARD 命令获取一个 set 的基数(cardinality),即 set 中的元素个数。SCARD key

时间复杂度:O(1)
返回值:set 内元素的个数

127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> scard key
(integer) 8

SPOP

SPOP 命令从 set 中删除并返回一个或者多个元素,这里是 pop,那么是否意味着是从 set 的末尾删除呢?其实不是的,因为 set 中的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作是随机的。SPOP key [count]

时间复杂度:O(N),N是count
返回值:删除的元素的值

127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> spop key
"1"
127.0.0.1:6379> spop key 3
1) "6"
2) "7"
3) "2"127.0.0.1:6379> spop key 10 # 如果count的值大于set中元素的个数,那么会将set中的所有元素都删除
1) "3"
2) "4"
3) "5"
4) "8"

SMOVE

SMOVE 命令将一个元素从 set 中取出并且放入目标 set 中。SMOVE source destination member

时间复杂度:O(1)
返回值:1表示移动成功,0表示移动失败

127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
(integer) 8
127.0.0.1:6379> smove key key2 3
(integer) 1
127.0.0.1:6379> smembers key2
1) "3"
127.0.0.1:6379> smove key key2 10 #key中不存在10这个元素,就会移动失败
(integer) 0
127.0.0.1:6379> smembers key2
1) "3"
127.0.0.1:6379> sadd key 3 #再向key中添加3元素,然后将这个3再移动到key2中,返回值是1表示成功了,key中的3会被删除,但是由于key2中已经存在3这个元素了,所以不会再将3插入
(integer) 1
127.0.0.1:6379> smove key key2 3
(integer) 1
127.0.0.1:6379> smembers key2
1) "3"
127.0.0.1:6379> smembers key
1) "1"
2) "2"
3) "4"
4) "5"
5) "6"
6) "7"
7) "8"

SREM

SREM 命令删除 set 中指定元素。SREM key member[member...]

时间复杂度:O(N),N为要删除的元素的个数
返回值:本次操作删除的元素的个数

127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7 [
(integer) 9
127.0.0.1:6379> srem key 1
(integer) 1
127.0.0.1:6379> smembers key
1) "7"
2) "6"
3) "4"
4) "3"
5) "8"
6) "5"
7) "2"
8) "["
127.0.0.1:6379> srem key 2 3 4
(integer) 3
127.0.0.1:6379> smembers key
1) "6"
2) "8"
3) "["
4) "7"
5) "5"

集合间操作

集合间操作包括:交集、并集和差集

SINTER

SINTER 命令获取给定 set 交集中的元素。SINTER key[key...]

时间复杂度:O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
返回值:交集的元素

127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sinter key1 key2
1) "3"
2) "4"

SINTERSTORE

SINTERSTORE 命令将 set 交集的元素保存到目标 set 中。SINTERSTORE destination key[key...]

时间复杂度:O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
返回值:交集的元素的个数

127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sinterstore key3 key1 key2
(integer) 2
127.0.0.1:6379> smembers key3
1) "3"
2) "4"

SUNION

SUNION 命令获取给定 set 并集的元素。SUNION key[key...]

时间复杂度:O(N),给定的所有集合的元素个数之和
返回值:并集的元素

127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sunion key1 key2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

SUNIONSTORE

SUNIONSTORE 命令获取指定 set 集合的并集并将其保存在目标 set 中。SUNIONSTORE destination key[key..]

时间复杂度:O(N),N为给定的 set 的所有元素的个数
返回值:并集的元素的个数

127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sunionstore key3 key1 key2
(integer) 6
127.0.0.1:6379> smembers key3
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"

SDIFF

SDIFF 命令获取给定 set 差集的元素。SDIFF key[key...]。假设是 SDIFF key1 key2,那么得到的结果就是 key1-key2。

时间复杂度:O(N),N为给定的集合中的所有元素的个数
返回值:差集中的元素

127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sdiff key1 key2 # 得到key1-key2
1) "1"
2) "2"
127.0.0.1:6379> sdiff key2 key1 # 得到key2-key1
1) "5"
2) "6"

SDIFFSTORE

SDIFFSTORE 命令获取指定 set 的差集并且将其保存到目标 set 中。SDIFFSTORE destination key[key...]

时间复杂度:O(N),N为给定集合所有元素的个数
返回值:差集元素的个数

127.0.0.1:6379> sadd key1 1 2 3 4
(integer) 4
127.0.0.1:6379> sadd key2 3 4 5 6
(integer) 4
127.0.0.1:6379> sdiffstore key3 key1 key2
(integer) 2
127.0.0.1:6379> smembers key3
1) "1"
2) "2"
127.0.0.1:6379> sdiffstore key4 key2 key1
(integer) 2
127.0.0.1:6379> smembers key4
1) "5"
2) "6"

命令小结

命令执行效果时间复杂度
sadd key member[member…]向set中添加一个或者多个元素O(K),K是插入的元素的个数
smembers key获取set中的所有元素O(N),N是set中所有元素的个数
sismember key member判断该元素是否是set中的元素O(1)
scard key获取set中元素的个数O(N),N是set中所有元素的个数
spop key [count]删除set中count个元素O(K),K为count
smove source destination member将source集合中的元素移动到destination集合中O(1)
srem key member[member…]删除set中指定元素O(K),K为要删除的元素的个数
sinter key [key …] sitnerstore求给定集合的并集O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
sunion key [key …] sunionstore求给定集合的并集O(N),N为给定的 set 的所有元素的个数
sdiff key [key …] sdiffstore求给定集合的差集O(N),N为给定的 set 的所有元素的个数

内部编码

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

  1. intset(整数集合):当集合中的元素都是整数且元素的个数小于 set-max-intset-entries 配置(默认是512个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用。
  2. hashtable(哈希):当集合类型无法满足 intset 的条件时,Redis 会选择使用 hashtable 作为集合的内部实现。
127.0.0.1:6379> sadd key 1 2 3 4 5
(integer) 5
127.0.0.1:6379> object encoding key
"intset"
127.0.0.1:6379> sadd key1 1 2 3 hello 5
(integer) 5
127.0.0.1:6379> object encoding key1
"hashtable"

使用场景

  • 标签和分类:
    • 集合可以用于存储对象的标签或分类信息。例如,你可以使用一个集合来存储所有属于“科技”类别的文章ID,另一个集合来存储所有属于“娱乐”类别的文章ID。这样,你可以快速查询某个类别下的所有文章,或者找出同时属于多个类别的文章。
  • 社交应用:
    • 在社交应用中,集合可以用于存储用户的关注列表、粉丝列表或好友列表。由于集合中的元素是唯一的,因此可以确保列表中没有重复的用户。
  • 实时统计:
    • 在实时统计场景中,集合可以用于存储需要快速访问和更新的数据。例如,你可以使用集合来记录某个时间段内的活跃用户ID,以便快速计算活跃用户数量。

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

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

相关文章

Flink 实时数仓(一)【实时数仓离线数仓对比】

前言 昨天技术面的时候,面试官说人家公司现在用的都是最新的技术,比如 Doris 等一些最新的工具,确实这些课是学校永远不会开设的,好在他说去了会带着我做一做。可是 ...... 学院舍不得让走啊 ...... 没办法,情况就是这…

DelphiWebMVC对VUE导出包的支持

MVC框架除了本身对html文件的渲染输出,先开始对Hbuilder或VSCode 开发的VUE项目的导出包,开始支持导出包的部署。 这是一个Hbuilder 的vue 项目,导出包为: 这是一个DelphiWeb项目, 这是DelphiWeb项目的运行目录&#x…

企业有必要上人事档案信息管理系统吗

人事档案是企业的重要资产,其中包含着员工的基本信息、合同、培训记录、绩效评估、离职手续等重要内容。通过建立人事档案信息管理系统,企业可以实现以下几点好处: 1. 提高工作效率:人事档案管理系统可以实现信息的集中存储和快速…

C语言操作符和关键字

文章目录 操作符单目操作符sizeof(类型)强制类型转换 关系操作符、逻辑操作符、条件操作符逗号表达式 常见关键字typedefstaticstatic修饰局部变量static修饰全局变量static修饰函数 register寄存器关键词define定义常量和宏 操作符 单目操作符 C语言中…

Echarts异步数据与动画加载

目录 简介 头部代码 这段代码是使用 Echarts 绘制图表的关键部分。首先,初始化了一个 Echarts 实例。然后,通过 Ajax 请求获取数据,并基于此设置图表选项。其中包括颜色、背景色、标题、提示框、图例以及饼图的具体配置。 具体解释如下&a…

python ERA5 画水汽通量散度图地图:风速风向矢量图、叠加等高线、色彩分级、添加shp文件、添加位置点及备注

动机 有个同事吧,写论文,让我帮忙出个图,就写了个代码,然后我的博客好久没更新了,就顺便贴上来了! 很多人感兴趣风速的箭头怎样画,可能这种图使用 NCL 非常容易,很多没用过代码的小…

「 网络安全常用术语解读 」软件物料清单SBOM详解

1. 概览 软件物料清单(Software Bill of Materials,SBOM)是软件成分信息的集合,SBOM文件中记录了软件产品或服务所使用组件、库、框架的清单,用于描述软件构建过程中使用的所有组件及其关系,以实现软件供应…

fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/

Git error. Command: git fetch stdout: stderr: fatal: unable to access ‘https://github.com/alibaba/flutter_boost.git/’: Failed to connect to github.com port 443 after 75005 ms: Couldn’t connect to server exit code: 128 GitHub (国际型)代码 分发平台/托管平…

人工智能中两个较为常见的评估模型性能指标(EVS、MAE)

1、解释方差(EVS) 官方社区链接:sklearn.metrics.explained_variance_score-scikit-learn中文社区 explained_variance_score是一个用于评估回归模型性能的指标,它衡量的是模型预测值与实际值之间关系的密切程度。具体来说,解释方差分数表示…

【Canvas与艺术】绘制铜质钢底24周年纪念章

【关键点】 底图的查找和多次尝试、文字描边。 【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>使用HTML5/Canvas绘…

图像处理的基本操作

一、PyCharm中安装OpenCV模块 二、读取图像 1、基本语法 OpenCV提供了用于读取图像的imread()方法&#xff0c;其语法如下&#xff1a; image cv2.imread&#xff08;filename&#xff0c;flags&#xff09; &#xff08;1&#xff09;image&#xff1a;是imread方法的返回…

OpenCompass 大模型评测实战——笔记

OpenCompass 大模型评测实战——笔记 一、评测1.1、为什么要做评测1.2、如何通过能力评测促进模型发展1.2.1、面向未来拓展能力维度1.2.2、扎根通用能力1.2.3、高质量1.2.4、性能评测 1.3、评测的挑战1.3.1、全面性1.3.2、评测成本1.3.3、数据污染1.3.4、鲁棒性 二、OpenCompas…

MSE实现全链路灰度实践

技术架构包括以下基础设施和云服务&#xff1a; 1个地域&#xff1a;ACK集群、微服务应用、MSE实例均部署在同一地域下。 1个专有网络VPC&#xff1a;形成云上私有网络&#xff0c;确保核心云资源的网络环境&#xff0c;如容器服务ACK、微服务引擎MSE。 ACK集群&#xff1a;简单…

开曼群岛:Web3企业的乐园

开曼群岛&#xff1a;Web3企业的理想之地 开曼群岛&#xff0c;在数字革命中大放异彩。近年来&#xff0c;该地区成立的Web3企业数量显著增加&#xff0c;如果保持目前的发展速度&#xff0c;并持续优化立法&#xff0c;那么扩展的速度将无可限量。本文将探讨推动这一增长的关…

STL-vector的使用及其模拟实现

在C中&#xff0c;vector是标准模板库&#xff08;STL&#xff09;中的一种动态数组容器&#xff0c;它可以存储任意类型的元素&#xff0c;并且能够自动调整大小。vector提供了许多方便的成员函数&#xff0c;使得对数组的操作更加简单和高效。 vector的使用 vector的构造函数…

国密SSL证书在等保、关保、密评合规建设中的应用

在等保、关保、密评等合规建设中&#xff0c;网络和通信安全方面的建设是非常重要的部分&#xff0c;需要实现加密保护和安全认证&#xff0c;确保传输数据机密性、完整性以及通信主体可信认证。国密SSL证书应用于等保、关保和密评合规建设中&#xff0c;不仅能够提升网络信息系…

创建第一个Vue3项目时遇到的报错及处理

其实主要就是针对命令&#xff1a;npm init vuelatest 的报错处理 受限自己电脑本身已经安装了node&#xff0c;npm&#xff0c;在环境搭建时&#xff0c;遇到了报错&#xff0c;如下&#xff1a; 我以为是这是个很简单的问题&#xff0c;看起来是npm的版本过低&#xff0c;升…

测试用例设计方法-探索性测试

生活犹如骑单车&#xff0c;唯有前进才能保持平衡。大家好&#xff0c;今天给大家分享一下关于探索性测试的方法&#xff0c;在探索性测试中更加考验测试人员的经验&#xff0c;所以我们在平时的测试工作中一定要多记录、多总结、多复盘&#xff0c;对于经常出现的bug深究其根本…

找对方法,单位信息宣传工作向媒体投稿其实也简单

曾经,作为一名肩负单位信息宣传重任的我,每当面对那堆叠如山的稿件与闪烁不定的电脑屏幕,心中总会涌起一股无尽的焦虑与疲惫。尤其在向媒体投稿这个环节,我仿佛陷入了一个难以挣脱的漩涡,邮箱投稿的艰辛、审核的严苛、出稿的迟缓以及成功发表的少之又少,如同一座座无形的大山压…

SpringBoot整合阿里云实现图片的上传管理

唠嗑部分 各位小伙伴大家好&#xff0c;我是全栈小白&#xff0c;之前我们分享了一期SpringBoot如何整合七牛云存储实现图片的上传与存储&#xff0c;今天我们接着分享一下SpringBoot整合阿里云OSS实现图片的上传与存储 言归正传 一、阿里云账号注册 阿里云OSS文件存储是免…