当前位置: 首页 > news >正文

【Redis】深入探索 Redis 的数据类型 —— 无序集合 Set

文章目录

  • 一、Set 类型介绍
  • 二、Set 类型相关命令
    • 2.1 添加元素和检查成员
    • 2.2 移除元素
    • 2.3 集合运算
      • 求交集
      • 求并集
      • 求差集
    • 2.4 Set 相关命令总结
  • 三、Set 类型编码方式
  • 四、Set 使用场景


一、Set 类型介绍

Set(集合)是 Redis 数据库中的一种数据类型,它是一种无序的、不重复的数据结构,用于存储一组唯一的元素。Set 在 Redis 中非常实用,因为它提供了高效的成员查找和去重功能,常用于处理一些需要存储唯一值的场景。以下是关于 Redis 中 Set 类型的介绍:

特点和用途:

  1. 无序性:Set 中的元素是无序排列的,与元素的插入顺序无关。

  2. 唯一性:Set 中的元素是唯一的,不允许出现重复元素。

  3. 高效的成员查找:Redis 提供了高效的成员查找操作,可以快速判断一个元素是否存在于集合中。

  4. 去重:由于元素的唯一性,Set 常用于去重操作,将一组数据转换为不含重复元素的数据集。

  5. 集合运算:Redis 提供了多个集合运算命令,可以对多个集合进行交集、并集和差集等操作。

  6. 支持多种数据类型:Set 可以存储字符串、数字、甚至其他 Redis 数据类型的元素。

二、Set 类型相关命令

Set(集合)是 Redis 中的一种无序且不重复的数据结构,它包含了一组唯一的成员。以下是与 Set 数据类型相关的常见命令:

2.1 添加元素和检查成员

  1. SADD:将一个或多个成员添加到集合中。

    语法:

    SADD key member [member ...]
    
  2. SMEMBERS:返回集合中的所有成员。

  3. SISMEMBER:检查指定成员是否存在于集合中。

    语法:

    SISMEMBER key member
    
  4. SCARD:获取集合的基数(即成员数量)。

    语法:

    SCARD key
    

2.2 移除元素

  1. SPOP:随机移除并返回集合中的一个成员。

    语法:

    SPOP key [count]
    
  2. SMOVE:将指定成员从一个集合移动到另一个集合。

    语法:

    SMOVE source destination member
    
  3. SREM:从集合中移除一个或多个成员。

    语法:

    SREM key member [member ...]
    

2.3 集合运算

求交集

  1. SINTER:返回多个集合的交集。

    语法:

    SINTER key [key ...]
    
  2. SINTERSTORE:将多个集合的交集存储到一个新集合中。

    语法:

    SINTERSTORE destination key [key ...]
    

求并集

  1. SUNION:返回多个集合的并集。

    语法:

    SUNION key [key ...]
    
  2. SUNIONSTORE:将多个集合的并集存储到一个新集合中。

    语法:

    SUNIONSTORE destination key [key ...]
    

求差集

  1. SDIFF:返回第一个集合与其他集合的差集。

    语法:

    SDIFF key [key ...]
    
  2. SDIFFSTORE:将第一个集合与其他集合的差集存储到一个新集合中。

    语法:

    SDIFFSTORE destination key [key ...]
    

2.4 Set 相关命令总结

以下是与 Set 类型相关的命令的总结,包括命令、作用和时间复杂度:

命令作用时间复杂度
SADD向集合中添加一个或多个成员O(N) (N 为添加成员的数量)
SMEMBERS返回集合中的所有成员O(N) (N 为集合中的元素数量)
SISMEMBER检查成员是否存在于集合中O(1)
SCARD获取集合的基数(成员数量)O(1)
SPOP随机移除并返回集合中的一个成员O(1)
SMOVE将成员从一个集合移动到另一个集合O(1)
SREM从集合中移除一个或多个成员O(N) (N 为移除成员的数量)
SINTER返回多个集合的交集O(N*M) (N 和 M 为集合的大小)
SINTERSTORE将多个集合的交集存储到一个新集合中O(N*M) (N 和 M 为集合的大小)
SUNION返回多个集合的并集O(N+M) (N 和 M 为集合的大小)
SUNIONSTORE将多个集合的并集存储到一个新集合中O(N+M) (N 和 M 为集合的大小)
SDIFF返回第一个集合与其他集合的差集O(N) (N 为第一个集合的大小)
SDIFFSTORE将第一个集合与其他集合的差集存储到一个新集合中O(N) (N 为第一个集合的大小)

Set 数据类型适用于需要存储一组唯一值的情况,例如标签、用户的兴趣爱好等。使用合适的 Set 相关命令,可以高效地进行成员的添加、删除、查找以及集合运算。

三、Set 类型编码方式

Redis 中的 Set 数据类型的内部编码方式有两种,分别是intsethashtable。这两种编码方式根据集合的大小和元素类型来选择,以最大程度地节省内存和提高性能。

  1. intset(整数集合)

    • 特点:intset 是 Redis 用于表示只包含整数值的集合的编码方式。它是一个有序的、紧凑的、不可重复的集合,内部使用整数表示元素值。

    • 适用场景:intset 适用于存储小型整数集合,因为它在内存占用和性能方面都非常高效。当集合中的元素都是整数且数量较少时,Redis 会选择使用 intset 编码。

    • 优点

      • 节省内存:intset 采用紧凑的二进制存储,每个整数只占用所需的字节。
      • 高效的查找和插入:由于元素都是整数且有序,查找和插入操作的时间复杂度是 O(log(N))。
  2. hashtable(哈希表)

    • 特点:hashtable 是 Redis 用于表示包含字符串、浮点数或其他数据类型的集合的编码方式。它是一个无序的、动态大小的集合,内部使用哈希表来存储元素。

    • 适用场景:hashtable 适用于存储包含各种数据类型的集合,以及大型集合,因为它可以动态增长并处理各种数据类型。

    • 优点

      • 适用性广泛:hashtable 可以存储不同类型的数据,而不仅限于整数。
      • 动态增长:可以随时添加或删除元素,适用于大型集合。

Redis 在使用 Set 类型时会根据集合的内容和大小自动选择 intset 或 hashtable 编码方式,以优化内存和性能。这种智能的编码方式选择是 Redis 内存管理的一部分,使得 Redis 在处理不同类型和大小的集合时能够充分发挥其优势。

四、Set 使用场景

场景:标签管理

假设你正在开发一个社交平台,需要为用户添加兴趣标签,并能够计算用户之间的共同兴趣标签。以下是如何使用 Redis 的集合数据类型来实现这个场景:

  1. 给用户添加标签

    用户A对娱乐、体育板块感兴趣,用户B对历史、新闻感兴趣,这些兴趣点可以被抽象为标签。

    SADD user:1:tags entertainment sports
    SADD user:2:tags history news
    

    这些命令将用户的标签信息存储在名为 user:1:tagsuser:2:tags 的集合中。

  2. 给标签添加用户

    现在,让我们为每个标签创建一个集合,用于存储对该标签感兴趣的用户。

    SADD entertainment:users user:1
    SADD sports:users user:1
    SADD history:users user:2
    SADD news:users user:2
    

    这些命令将用户与其对应的标签建立关联关系。

  3. 删除用户下的标签

    如果用户取消了对某些标签的兴趣,可以使用 SREM 命令来删除相应的标签。

    SREM user:1:tags sports
    

    这个命令将用户A的兴趣标签中的 “sports” 删除。

  4. 删除标签下的用户

    如果某个标签不再被用户关注,可以使用 SREM 命令来删除相应的用户。

    SREM sports:users user:1
    

    这个命令将用户A从 “sports” 标签的关注列表中移除。

  5. 计算用户的共同兴趣标签

    要计算两个用户的共同兴趣标签,可以使用 SINTER 命令。

    SINTER user:1:tags user:2:tags
    

    这个命令将返回用户1和用户2的共同兴趣标签。

通过这些 Redis 的集合操作,你可以轻松地实现标签管理功能,包括用户的兴趣标签添加、删除以及计算用户之间的共同兴趣标签。这对于增强用户体验和个性化推荐非常有帮助。

除了标签管理之外,Redis 的集合数据类型还适用于许多其他场景。以下是一些额外的场景示例:

  1. 社交网络关系:在社交网络应用中,你可以使用集合存储用户的好友列表、关注列表和粉丝列表,以及用户之间的共同好友等信息。这使得查找和管理社交关系变得非常高效。

  2. 在线用户管理:集合可以用于维护在线用户列表,快速检查用户是否在线,以及获取在线用户的数量和列表。这对于实时聊天、在线游戏等应用非常有用。

  3. 投票和计数:你可以使用集合来记录投票或计数的情况,例如统计文章的点赞数、收藏数、评论数等。每个用户可以在集合中表示一次投票或计数操作,而集合会自动去重。

相关文章:

【Redis】深入探索 Redis 的数据类型 —— 无序集合 Set

文章目录 一、Set 类型介绍二、Set 类型相关命令2.1 添加元素和检查成员2.2 移除元素2.3 集合运算求交集求并集求差集 2.4 Set 相关命令总结 三、Set 类型编码方式四、Set 使用场景 一、Set 类型介绍 Set(集合)是 Redis 数据库中的一种数据类型&#xf…...

可变参数JAVA

public class Main {public static void main(String[] args) {//方法形参的个数是可以变化的//格式:属性类型...名字System.out.println(getSum(1,2,3,4,5,6,7,8));}//通过键值对对象来遍历;public static int getSum(int a,int...args){//可变参数;int…...

Zabbix监控平台部署流程

Zabbix WEB、Zabbix Server、Zabbix Database放在一台服务器;(192.168.10.12)Zabbix Agent部署在被监控服务器上 (192.168.10.11)Zabbix Porxy 单独部署在一台服务器上(被监控服务器少于500台可以不部署&am…...

重磅!文晔以38亿美元收购富昌电子 | 百能云芯

文晔微电子股份有限公司(文晔科技)于9月14日正式宣布已完成对富昌电子公司(Future Electronics Inc.)100%股权的收购,该交易以全现金方式完成,总交易价值高达38亿美元。 文晔科技的董事长兼首席执行官郑家强…...

Multimodel Image synthesis and editing:The generative AI Era

1.introduction 基于GAN和扩散模型,通过融入多模态引导来调节生成过程,从不同的多模态信号中合成图像;是为多模态图像合成和编辑使用预训练模型,通过在GAN潜在空间中进行反演,应用引导函数,或调整扩散模型…...

Linux——(第十章)进程管理

目录 一、概述 二、常用指令 1.ps查看当前系统进程状态 2.kill 终止进程 3.pstree 查看进程树 4.top 实时监控系统进程状态 5.netstat 监控网络状态 一、概述 (1)进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体&#…...

【操作系统】聊聊协程为什么可以支撑高并发服务

在实际的业务开发中,比如针对一个业务流程,调用三方,然后存储数据,从oss上获取数据。其实都是进行的同步调用,说白了就是A完成之后,B在继续完成。如果整个过程中A、B、C 分别耗时100、300、200毫秒。那么整…...

算法leetcode|80. 删除有序数组中的重复项 II(rust重拳出击)

文章目录 80. 删除有序数组中的重复项 II:样例 1:样例 2:提示: 分析:题解:rust:go:c:python:java: 80. 删除有序数组中的重复项 II: …...

Vite 完整版详解

1. 打包构建: Vite 使用 Rollup 作为默认的构建工具。通过运行 npm run build 命令,Vite 会将应用程序的源代码打包成一个或多个优化的静态文件,以便在生产环境中进行部署。Vite 的构建过程会根据需要进行代码拆分、压缩和优化,以…...

AI入门指南:探索人工智能的基础原理和实际应用

引言 介绍AI的基本概念:什么是人工智能,为什么它如此重要。 引出博客的主要内容,即AI的基础原理和实际应用。 第一部分:AI的基础原理 什么是人工智能: 解释AI的定义和范畴。 介绍AI的历史和发展。 机器学习入门&#x…...

使用 Webpack 从 0 到 1 构建 Vue3 项目 + ts

使用 Webpack 从 0 到 1 构建 Vue3 项目 1.初始化项目结构2.安装 webpack,补充智能提示3.初步编写 webpack.config.js3.1设置入口文件及出口文件3.2 指定 html 模板位置 4.配置 运行/打包 命令,首次打包项目5.添加 Vue 及相关配置5.1安装并引入 vue5.2 补…...

【Git】Git 分支

Git 分支 1.分支简介 为了真正理解 Git 处理分支的方式,我们需要回顾一下 Git 是如何保存数据的。 或许你还记得 起步 的内容, Git 保存的不是文件的变化或者差异,而是一系列不同时刻的 快照 。 在进行提交操作时,Git 会保存一…...

.NET Upgrade Assistant 升级 .NET MAUI

.NET Upgrade Assistant 是一种可帮助您将应用程序升级到最新的 .NET版本 的工具,并且您可以使用这个工具将您的应用程序从旧平台(例如 Xamarin Forms 和 UWP)迁移到新的平台。此外,这个新版本的工具,可以让您在不更改…...

记一次诡异的Cannot find declaration to go to,Cannot resolve method

记一次诡异的 Cannot find declaration to go to, Cannot resolve method getOnExpressions in Join 对于项目中通常问题,清除缓存,重启idea,或者仔细检查语法通常都能解决问题,但是这次却失效了,以下是原…...

智慧园区:AI边缘计算技术与视频监控汇聚平台打造智慧园区解决方案

一、行业趋势与背景 智慧园区是现代城市发展的重要组成部分,通过智能化技术提高园区的运营效率、降低成本、增强环境可持续性等具有重要作用。在智慧园区中,人工智能和视频汇聚技术是重要的前置技术。人工智能技术可以实现对数据的智能化处理和分析&…...

SpringCloud(17~21章):Alibaba入门简介、Nacos服务注册和配置中心、Sentinel实现熔断与限流、Seata处理分布式事务

17 SpringCloud Alibaba入门简介 17.1 why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now 说明 Spring Cloud Netflix Projects Entering Maintenance Mode 什么是维护模…...

Jmeter安装与测试

目录 一:JMeter简介: 二:JMeter安装与配置 三:JMeter主要原件 一:JMeter简介: JMeter,一个100%的纯Java桌面应用,由Apache组织的开放源代码项目,它是功能 …...

java开发环境从0开始 【汇总版】

java开发环境从零开始 第一步:jdk第二步:安装 mysql第三步:安装maven第四步:idea最新免费安装第五步:安装navicate第六步 :安装git, 第一步:jdk 第一步当然是最先安装java开发环境啦。 看这个链…...

线性代数的本质(九)——二次型与合同

文章目录 二次型与合同二次型与标准型二次型的分类度量矩阵与合同 二次型与合同 二次型与标准型 Grant:二次型研究的是二次曲面在不同基下的坐标变换 由解析几何的知识,我们了解到二次函数的一次项和常数项只是对函数图像进行平移,并不会改变…...

STM32WB55开发(4)----配置串口打印Debug调试信息

STM32WB55开发----4.配置串口打印Debug调试信息 概述硬件准备视频教学样品申请选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙开启串口调试配置蓝牙参数设置工程信息工程文件设置Keil工程配置代码配置结果演示 概述…...

云原生服务无状态(Stateless)特性的实现

文章目录 为何要使用无状态服务?无状态服务的实现方法1. 会话状态外部化2. 负载均衡3. 自动伸缩4. 容器编排5. 数据存储6. 安全性 示例:使用Spring Boot实现无状态服务结论 🎉欢迎来到云计算技术应用专栏~云原生服务无状态(Statel…...

zookeeper最基础教程

文章目录 一、简介1、工作机制2、特点3、数据结构4、应用场景5、选举机制 二、软件安装1、单机版安装2、集群安装3、配置参数解读(zoo.cfg)4、ZK集群启动脚本 三、命令行操作1、语法2、使用3、节点相关4、监听器原理5、节点删除与查看 三、写数据流程 一、简介 1、工作机制 官…...

又一重磅利好来袭!Zebec Payroll 集成至 Nautilus Chain 主网

流支付协议 Zebec Protocol 正在积极的拓展自身生态,随着此前其全新路线图的发布,揭示了该生态从 Web3 世界向 Web2 世界跨越的决心。根据其最新路线图,Zebec Protocol 正在从最初构建在 Solana 上的流支付协议,拓展为囊括模块化公…...

NLP模型的tokenize方法中return_tensors参数

NLP模型的tokenize方法中return_tensors参数 在许多NLP模型的tokenize方法中,return_tensors参数可以指定tokenize之后返回的张量类型,常见的可选值包括: ‘tf’: 返回TensorFlow的张量对象Tensor。 ‘pt’: 返回PyTorch的张量对象torch.Tensor。 ‘np’: 返回NumPy的ndarray对…...

模方新建工程时,显示空三与模型坐标系不一致怎么解决

答:检查空三xml与模型的metadata.xml的坐标系是否一致,metadata文件是否有在data目录外面。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.0新增单体化建模模块,…...

氧化锌避雷器绝缘电阻测试

氧化锌避雷器 绝缘电阻测试 试验目的 避雷器绝缘电阻包括本体绝缘电阻和底座绝缘电阻, 主要目的在于初步检查避雷 器内部是否受潮; 有并联电阻者可检查其通、 断、 接触和老化等情况。 试验设备 高压绝缘电阻测试仪 厂家: 湖北众拓高试 试验方法 本体绝缘电阻试验…...

链动2+1系统开发

什么是链动21模式? 链动21主要是一个集团队搭设、快速提升产品销量,与消费者做到合作共赢的一个商业模式,让用户在享受购物折扣的同时,也能获得相对收益,同时公司也能达到产品快速销售这样的一个目的,而链…...

AIGC(生成式AI)试用 4 -- 从模糊到精确

从模糊到精确,也许差异在于 更多的描述,更多的信息更具像的描述,更多的数据,更有效的信息主题明确和目标清晰层次感与条理性更简洁清晰的逻辑 “说清楚点,不太明白,提供更多的信息也许能知道要做什么。” …...

Linux中使用Docker安装ElasticSearch7.10.x集群

使用Docker安装ElasticSearch7.10.x单节点请访问这里 一、集群环境说明 服务器IP地址192.168.137.1,192.168.137.2,192.168.137.3 二、前期准备 1. 拉取镜像 docker pull elasticsearch:7.10.12. 首先需要创建一个用于生成秘钥的初始容器&#xff0…...

electron 左上角图标 dev(开发环境)可显示 build(打包)后无法显示

先说解决方法,用于作为图标的ico文件需要富集多种尺寸,必须包含256*256,且同时应当包含其他更小的尺寸。 例如: 接下来解释一下这么做的原因 ico是Iconfile的缩写,是Windows计算机中的一种图标文件格式,…...

seo优化网站建设哪家好/深圳网站设计小程序

1 jar包冲突 下载Maven Helper插件 图1 Maven Helper检查冲突 图2 检查冲突2 包依赖 druid包依赖mybatis包。使用druid时必须同时添加mybatis。 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter&…...

做app网站公司/云盘网页版登录

对于网络I/O模型的学习&#xff0c;在操作系统中是非常重要的一环&#xff0c;因为I/O也同样是我们系统设计中至关重要的一个方面和要考虑的因素&#xff0c;因此想利用一篇文章来解析一下&#xff0c;就目前而言&#xff0c;业界对五种网络I/O模型的分类&#xff0c;主要分为以…...

千博医院网站模板/如何建立电商平台

WINDOWS 2008 2012 1016等&#xff0c;桌面默认没有我的电脑&#xff0c;文档&#xff0c;网络等图标&#xff0c;操作时候&#xff0c;就不方便&#xff0c;以下提供几种方法。方法一&#xff1a;本地输入运行如果是在Windows Server 2012本地控制台下&#xff0c;直接按Win(键…...

php做的网站手机能看到/平台推广精准客源

传送门 今天在HackerRank上翻到一道高精度题&#xff0c;于是乎就写了个高精度的模板&#xff0c;说是模板其实就只有乘法而已。 Extra long factorials Authored by vatsalchanana on Jun 16 2015Problem Statement You are given an integer N. Print the factorial of this …...

做外国的独立网站怎么推广/百度搜索关键词热度

2019独角兽企业重金招聘Python工程师标准>>> http://flywind.org/newtechnologydetail/175 转载于:https://my.oschina.net/flywind/blog/82647...

php网站开发实例教程 源码/深圳百度搜索排名优化

一、什么是 ETLETLETL是数据抽取(EXTRACT)、转换(TRANSFORM)、加载(LOAD )的简写&#xff0c;它是将OLTP系统中的数据经过抽取&#xff0c;并将不同数据源的数据进行转换、整合&#xff0c;得出一致性的数据&#xff0c;然后加载到 数据仓库中。简而言之ETL是完成从 OLTP系统到…...