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、需要请联系

十八、QGIS的作用和下载

最近在学习webGIS的时候,发现路径文件是geoJSON文件,那么如果是你没有这个文件怎么办,从哪里能够获取呢,我最近就查询了文档,发现大多数都是shp转geoJSON,或者是osm转geoJSON,那如何去转换呢,就有两个方法,如果只关注QGiS,第一个方法可以忽略。 一、 安装ogr2ogr 具…

练习题(2024/4/)

1无重叠区间 给定一个区间的集合 intervals ,其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。 示例 1: 输入: intervals [[1,2],[2,3],[3,4],[1,3]] 输出: 1 解释: 移除 [1,3] 后,剩下的区间没有…

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…

川宁生物业绩持续高涨

4月21日晚间,川宁生物发布2023年年报。2023年,公司实现营业收入约48.23亿元,同比增长26.24%;实现归母净利润约9.41亿元,同比增长128.56%;基本每股收益达0.42元,同比增长100.00%。 这一优异的业…

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

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

Python_偏函数

什么是Python中的偏函数 Python中的偏函数是指通过固定函数的部分参数来创建一个新的函数。这个新函数称为偏函数,它可以用来简化函数调用,特别是当需要多次使用相同的函数但部分参数保持不变时。Python标准库中的functools模块提供了partial函数来实现…

shapefile转openstreetmap

文章目录 Shapefile (shp)OpenStreetMap (OSM)绘制shpfile安装JOSM安装opendata插件shp转osmShapefile (shp) Shapefile 是一种常用的地理空间矢量数据格式,由 ESRI 开发和主导。Shapefile 可以存储点、线、面等几何要素,以及与每个要素相关的属性数据。Shapefile 通常包含多个…

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

go 基础概念-变量和类型使用注意事项

在 Goland 语言中,变量是存储数据的容器,而类型定义了变量可以存储的数据种类和可以对变量执行的操作。以下是在使用 Go 变量和类型时的一些注意事项: 变量声明 显式声明:使用 var 关键字显式声明变量类型。类型推断&#xff1a…

R-tree:一种高效的空间数据索引结构

引言: 在处理大规模空间数据集,如地理信息系统(GIS)中的遥感数据时,高效的数据存储和查询至关重要。R-tree,作为一种自平衡的空间数据索引结构,因其出色的性能而在空间数据库中得到了广泛应用。…

理解C语言中的位操作和整数类型:一个温度传感器读取问题的解析

前言:当我们编写嵌入式系统的代码时,我们经常需要使用位操作来处理硬件设备的数据。然而,如果我们对C语言的位操作和整数类型不完全理解,可能会遇到一些难以理解的问题。在这篇博客中,我将通过一个实际的例子来解释这些概念&#…