Redis(六) Set集合类型

在这里插入图片描述

文章目录

  • 前言
  • 命令
    • 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.mzph.cn/news/828202.shtml

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

相关文章

java 抽象类(abstract)

1 由abstract修饰的类叫做抽象类 也可以修饰抽象方法 2 abstract修饰的抽象方法不可以在抽象类当中实现 但一定要在子类当中重写 并实现 public abstract class p1 { public abstract void work(); public void run() { System.out.println("run"); } } class prog…

基于springboot+vue的民法普及系统的设计与实现

1、系统演示视频(演示视频) 2、需要请联系

2. 多机多卡运行nccl-tests对比分析

系列文章 第2章 多机多卡nccl-tests 对比分析 目录 系列文章前言一、本地环境1. 网卡接口2. RDMA3. TOPO信息pcie信息nvidia-smi topo -m 二、nccl-test对比分析1. 相关环境变量2. 不同情况的对比3. 总结与分析 前言 NCCL(NVIDIA Collective Communications Libra…

javaWeb项目-房屋房租租赁系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、JSP技术 JSP(Jav…

实战技巧:Android 14适配从挂号到出院

公众号「稀有猿诉」 原文链接 实战技巧:Android 14适配从挂号到出院 啥?这都4202年了,你的应用还没有升级到targetSDK 34?莫慌,本文就带着你全面的了解升级targetSDK 34的方法以及避坑指南。 注意,A…

毫米波雷达模块在高精度人体姿态识别的应用

人体姿态识别是计算机视觉领域中的重要问题之一,具有广泛的应用前景,如智能安防、虚拟现实、医疗辅助等。毫米波雷达技术作为一种无需直接接触目标就能实现高精度探测的感知技术,在人体姿态识别领域具有独特的优势。本文将探讨毫米波雷达模块…

Linux系统IO

Linux系统中的IO函数主要包括两大类:标准C库中的函数和Linux系统调用。这些函数可以用于文件操作、网络通信、设备控制等多种IO任务。以下是Linux系统中常用的IO函数和系统调用的概述: 标准C库IO函数 这些函数是高级的、封装好的,并且与操作…

二叉搜索树的众数(力扣501)

题目如下: 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。 假定 BS…

Modbus转Profinet网关接电表与工控机通讯

Modbus转Profinet网关(XD-MDPN100/300)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持Modbus RTU主站/从站,并可以与RS485接口的设备,如变频器…

德国激荡50年的荆棘之路

财通证券表示,过去50年见证了德国如何走出财政泥沼、以保守的货币政策稳步前行,见证了“专精特新”带来的全球竞争力,也见证了产业转型缓慢导致的增长动能缺失。 过去50年,德国经济经历了一段跌宕起伏的发展史,这辆曾…

面向对象三大特征(python)

目录 1. 封装 为什么使用封装? 如何实现封装? 一个简单的封装示例 二.继承 为什么使用继承? 如何实现继承? 一个简单的继承示例 使用继承的好处 三.多态 为什么使用多态? 如何实现多态? 一个简…

【基于YOLOv8的森林烟雾火焰检测 附源码 数据集】

基于YOLOv8的森林烟雾火焰检测 附源码 数据集 在森林火灾的早期预防和控制中,森林烟雾火焰检测技术发挥着至关重要的作用。本技术通过先进的传感器和图像识别系统,实时监测森林区域中的烟雾和火焰异常,快速响应可能的火灾发生。森林烟雾火焰…

在ubuntu上搭建nexus私有仓库(指定版本以及jdk!)

前言 本来以为搭建一个nexus随随便便就好了,但是遇到了最新版本根本没办法在jdk17下面正常运行—起码我调了一下不知道怎么运行,我才知道。。。不升级版本其实是很有道理的。 这一篇是最新版本的尝试: 在ubuntu上搭建nexus私有仓库[失败草稿…

升级 jQuery:努力打造健康的 Web 生态

jQuery 对 Web 的影响始终是显而易见的。当 jQuery 在 2006 年首次推出时,几乎立即成为 Web 开发人员的基本工具。它简化了 JavaScript 编程,使操作 HTML 文档、处理事件、执行动画等变得更加容易。从那时起,它在 Web 标准和浏览器功能的演变…

从0开始用C写贪吃蛇(基于链表)

目录 1. 游戏背景 2. 游戏效果演示​编辑​编辑​编辑 3. 实现目标 4. 技术要点 5. 控制台程序 5.1 设置控制台窗口的长宽和名字 5.2 控制台屏幕上的坐标COORD 6.Win32 API 6.1 GetStdHandle 6.2 GetConsoleCursorInfo 6.3 CONSOLE_CURSOR_INFO 6.4 SetConsole…

Docker 网络与资源控制

一 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根 据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默 认网关。因为在同…

带头循环双向链表专题

1. 双向链表的结构 带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨 的” “哨兵位”存在的意义: 遍历循环链表避免死循环。 2. 双向链表的实现 2.1双向链表结构 typedef int DataTyp…

最新AI创作系统ChatGPT网站源码Midjourney-AI绘画系统,Suno-v3-AI音乐生成大模型。

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…

Ubuntu终端自动补全

文章目录 前言配置安装zsh安装 oh-my-zsh安装自动补全插件zsh-autosuggestions 参考 前言 Oh My Zsh 是一个针对命令行 shell 的开源框架,主要用于增强和美化命令行环境。它建立在 Zsh(一种强大的 shell 替代品)之上,提供了丰富的…

Kubernetes Kubelet 的 Cgroups 资源限制机制分析

前言 容器技术的两大技术基石,想必大家都有所了解,即 namespace 和 cgroups。但你知道 cgroups 是如何在 kubernetes 中发挥作用的吗?kubelet 都设置了哪些 cgroups 参数来实现对容器的资源限制的呢?本文就来扒一扒 Kubernetes k…