图解Redis 04 | Set数据类型的原理及应用场景

news2025/1/17 0:06:10

介绍

Redis 的 Set 类型是一个不允许重复元素的集合,元素存储的顺序不按照插入的顺序,因此属于无序集合。一个 Set 最多可以存储 2^32 - 1 个元素,这与数学中的集合概念类似。Set 类型不仅支持增、删、改、查等操作,还支持多个Set之间的交集、并集和差集运算。

内部实现

Set 类型的底层数据结构可以通过哈希表或intset实现:

  • 如果集合中的所有元素都是整数,并且元素个数小于 512(默认值,可通过属性 set-maxintset-entries 配置),Redis 会使用intset作为 Set 类型的底层数据结构。
  • 如果集合中的元素不符合上述条件,Redis 会使用哈希表作为 Set 类型的底层数据结构。

常用命令

添加一个或多个元素。
sadd key member [member …]

> sadd myset v1 v2 v3
(integer) 3integer) 3
查询集合中的所有元素。
smembers key

127.0.0.1:6379> smembers myset 
1)“v1” 
2)“v3” 
3)“v2”
查询集合中成员的数量。
scard key

> scard myset
(integer) 3integer) 3

命令:scard key

查询集合中是否包含某个元素。
sismember key member

> sismember myset v1
(integer) 1integer) 1
> sismember myset v4
(integer) 0
将元素从一个集合移动到另一个集合。
smove source destination member

> sadd myset2 v1 v8
(integer) 2integer) 2
> smembers myset2
1) "v1"
2) "v8"
> smove myset myset2 v3
(integer) 1
> smembers myset2
1) "v3"
2) "v1"
3) "v8"
> smembers myset
1) "v1"
2) "v2"
删除集合中的一个或多个元素。
srem key member [member …]

> smembers myset2
1) "v3"
2) "v1"
3) "v8"
127.0.0.1:6379> srem myset2 v1
(integer) 1
> smembers myset2
1) "v3"
2) "v8"

注意:使用srem指令时,不存在的元素将被忽略。

返回一个或多个集合的交集。
sinter key [key …]

> sadd myset3 v1 v2 v3
(integer) 33
> smembers myset3
1) "v3"
2) "v1"
3) "v2"
127.0.0.1:6379> smembers myset2
1) "v3"
2) "v8"
127.0.0.1:6379> sinter myset myset2
1) "v3"

更多操作命令,详见文章末尾部分。

应用场景

Set数据结构凭借其无序、不可重复的特性,以及支持并集、交集、差集等丰富操作,在多个场景中展现出卓越的价值。特别是在数据去重保证数据唯一性方面,Set 类型表现优异,除此之外,Set还适合用于统计多个集合之间的交集、并集和差集等关系。

当需要存储的数据不要求保持特定顺序,并且要求数据项唯一、不能重复时,Set 类型无疑是一个理想的选择。

然而,需要注意的是,虽然 Set 提供了强大的集合操作功能,但在处理大规模数据时,直接进行差集、并集、交集等操作的计算复杂度可能会比较高,从而可能导致 Redis 实例在处理过程中出现性能瓶颈或阻塞现象。

在主从集群架构中,为了避免主库因执行这些集合操作而导致的阻塞问题,建议采用以下策略之一

  1. 可以选择一个从库专门用于执行这些聚合计算任务,从而减轻主库的负担;
  2. 可以将原始数据返回给客户端,让客户端负责相关的聚合统计计算。

这两种方式都可以有效避免主库因计算复杂度高而带来的性能问题。

关于主从集群架构的更多细节,我会在后续的文章中进行介绍,这里先留个印象就好了。

场景一:文章点赞

以下是一个示例场景:假设我们有一个文章 ID 为 article:1 的文章。为了记录用户对这篇文章的点赞情况,使用 Set 类型,key为文章 ID article:1,而 Set 中的每个元素代表一个用户 ID。

Set 类型其元素的不可重复性可以确保一个用户只能对某篇文章点赞一次。因此Set 中有多少个元素就代表了有多少个用户对文章点赞了。

例如,用户 uid:1、uid:2 分别对文章 article:1 进行了点赞。这时,article:1 对应的 Set 中将包含这2位用户的 ID:

> SADD article:1 uid:100001
(integer) 1

> SADD article:1 uid:100002
(integer) 1
获取喜欢article:1文章的用户数:
> SCARD article:1
(integer) 2
获取所有喜欢article:1文章的用户。
> SMEMBERS article:1
1) "uid:100002"
2) "uid:100001"
判断用户是否uid: 100002喜欢该篇文章.
> SISMEMBER article:1 uid:100002
(integer) 1  
用户uid:100001取消对article:1文章点赞
> SREM article:1 uid:100001
(integer) 1

场景二:共同关注的好友

Set 类型支持交集运算,因此可以用来计算多个用户关注的共同对象,例如共同关注的好友或博主。

假设我们有两个用户和他们关注的博主账号信息:

  • 用户 uid:1 关注了账号 ID 为 7、8、9。
  • 用户 uid:2 关注了账号 ID 为 8、9、10。
> SADD uid:1 7 8 9
(integer) 3

> SADD uid:2 8 9 10
(integer) 3
uid:1uid:2共同关注的博主集合
> SINTER uid:1 uid:2
1) "8"
2) "9"

Set类型与List类型的区别

最后,我们来看看 Set 类型和 List 类型的一些主要区别:

Set 类型:

  • 元素无序且不重复:Set 中的元素不按照任何特定顺序存储,并且每个元素在集合中是唯一的,不允许重复。
  • 主要用途:适用于快速判断集合中某个元素是否存在,计算集合的交集、并集、差集等操作。
  • 适用场景:适合存储具有唯一标识符且不关心顺序的元素集,例如标签集或用户的唯一 ID 列表。

List 类型:

  • 元素有序可以重复:List 中的元素按照插入的顺序存储,可以通过索引访问每个元素。
  • 支持操作:支持在头部或尾部添加、删除元素等操作。
  • 常见用途:常用于实现队列、栈等数据结构,按顺序存储一系列相关元素,例如消息队列或任务列表。

更多集合操作命令

移除并返回集合中的一个随机元素。
spop key [count]

> smembers myset
1) "v1"
2) "v2"
> spop myset 1
1) "v1"
> smembers myset
1) "v2"
随机返回集合中指定数量的元素列表。
srandmember key [count]

> sadd myset v2 v3 v4
(integer) 3
> srandmember myset 2
1) "v2"
2) "v4"
将集合的交集复制到新集合。
sinterstore destination key [key …]

127.0.0.1:6379> smembers myset
1) "v3"
2) "v4"
3) "v2"
127.0.0.1:6379> smembers myset2
1) "v3"
2) "v8"
127.0.0.1:6379> sinterstore myset4 myset myset2
(integer) 1
127.0.0.1:6379> smembers myset4
1) "v3"

需要注意的是将集合 myset 和集合 myset2 的并集元素(如 v3)复制到了新集合 myset4 中。而v3 等元素依然保留在原始集合中,不会被删除。

查询一个或多个集合的并集。
sunion key [key …]

127.0.0.1:6379> smembers group1
1) "java"
127.0.0.1:6379> smembers group2
1) "golang"
127.0.0.1:6379> sunion group1 group2
1) "java"
2) "golang"
将一个或多个集合的并集复制到一个新集合。
sunionstore destination key [key …]

127.0.0.1:6379> smembers group1
1) "java"
127.0.0.1:6379> smembers group2
1) "golang"
127.0.0.1:6379> sunionstore group3 group1 group2
(integer) 2
127.0.0.1:6379> smembers group3
1) "java"
2) "golang"

需要注意的是该命令只会多个集合的并集元素复制到一个新集合,被复制的元素不会从原始集合中删除。

查询多个集合的差异集。
sdiff key [key …]

127.0.0.1:6379> smembers group1
1) "java"
2) "golang"
127.0.0.1:6379> smembers group2
1) "golang"
127.0.0.1:6379> sdiff group1 group2
1) "java"
将多个集合的差异集复制到一个新集合。
sdiffstore destination key [key …]

127.0.0.1:6379> smembers group1
1) "java"
2) "golang"
127.0.0.1:6379> smembers group2
1) "golang"
127.0.0.1:6379> sdiffstore group3 group1 group2
(integer) 1
127.0.0.1:6379> smembers group3
1) "java"

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

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

相关文章

微软的 Drasi:一种轻量级的事件驱动编程方法

微软的开源数据变化处理平台有望提供一种全新的方式来构建和管理可产生持续事件流的云应用程序。 Microsoft Azure 孵化团队是微软超大规模云中比较有趣的组成部分之一。它介于传统软件开发团队和研究组织之间,致力于构建大规模分布式系统问题的解决方案。 这些解决…

使用拖拽生成活动海报(vue项目)

<template><div class"poster-editor"><div class"toolbar" v-if"edit 1"><div style"text-align: center;font-size: 14px;font-weight: 700;margin-bottom: 10px;">工具栏</div><div class"…

WPF组件的自定义模板和触发器全面解析

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软提供的一个用于构建桌面客户端应用程序的UI框架。其依赖于XAML&#xff08;Extensible Application Markup Language&#xff09;进行用户界面设计&#xff0c;提供了一套强大的控件和组件模型。在WPF开发中&…

C++ 的存储类型与新的 thread_local

1 C 的存储类型 1.1 存储周期&#xff08;Storage duration&#xff09; 存储周期表示一个变量的存储空间持续的时间&#xff0c;它应该与对象的语义生命周期一致&#xff08;或至少不小于对象的语义生命周期&#xff09;。C 98从 C 继承了三种存储周期&#xff0c;分别是静态…

【黑马点评】项目知识点及面经整理

【黑马点评】项目知识点及面经整理 1 短信登录&#xff08;Session&#xff0c;Redis&#xff0c;JWT验证&#xff09;1.1 JWT和Session的区别1.2 Session1.3 Redis1.3.1 基于Redis实现登录验证1.3.2 登录拦截 1.4 JWT1.4.1 JWT的有效验证1.4.2 JWT定义 2 热点数据缓存2.1 缓存…

区块链-智能合约Solidity编程

文章目录 一、ubuntu安装二、FISCO BCOS安装五、 WeBASE安装5.1 WeBASE简介5.2 节点前置服务搭建5.3 调用HelloWorld合约 七、Solidity极简入门7.1. 值类型7.2. 变量数据存储和作用域7.3. 函数7.4 控制流7.5 数组&映射7.6 结构体7.7 修饰符7.8 事件7.9 面向对象7.10 抽象合…

SoC芯片中Clock Gen和Reset Gen的时钟树综合

社区目前已经开设了下面列举的前四大数字后端实战课程&#xff0c;均为直播课&#xff0c;且均是小编本人亲自授课&#xff01;遇到项目问题&#xff0c;都可以远程一对一指导解决具体问题。小编本人是一线12年后端经验的数字后端工程师。想找一线IC后端技术专家亲自带你做后端…

Java Fork-Join框架学习

概述 Fork/Join是Java7提供的一个用于并行执行任务的框架&#xff0c;是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。Fork负责把一个大任务切分为若干并行执行的子任务&#xff0c;Join负责合并这些子任务的执行结果&#xff0…

Ubuntu系衍生版手动修改配置网卡的配置总结

一、Ubuntu系的IP地址配置文件的目录&#xff1a; sudo vim /etc/network/interfaces 二、以DHCP方式配置网卡&#xff1a; 在以上配置文件中添加以下两行&#xff1a; auto enp3s0 iface enp3s0 inet dhcp 三、为网卡配置静态IP地址&#xff1a; 在以上配置文件中添…

实验3,网络地址转换

实验3&#xff1a;网络地址转换 实验目的及要求&#xff1a; 通过实验&#xff0c;掌握NAT技术的工作原理&#xff0c;了解三种不同类型NAT技术的主要作用以及各自的主要应用环境。能够完成静态NAT和复用NAT技术的应用&#xff0c;并熟练掌握NAT技术相关的配置命令。 实验设…

el-date-picker选择时间后标准时间少1小时问题

问题 前端开发中发现Element的时间组件el-date-picker在选择选择部分时间后js对象的标准时间少1小时&#xff0c;如果选择的小时为0&#xff0c;会导致部分转换条件下结果少1天。 比如组件中选择的本地时间为&#xff1a; 1988-08-01 00:00:00 而js对象获取到是标准时间是&am…

ubuntu 安装kali命令补全功能

输入命令时&#xff0c;之前的命令会以阴影显示&#xff0c;按下右键或 Tab 键可以直接补全 安装zsh-autosuggestions sudo apt install zsh-autosuggestions编辑 ~/.zshrc环境变量 if [ -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then. /usr/share/zs…

【从零开始的LeetCode-算法】945. 使数组唯一的最小增量

给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 < i < nums.length 的下标 i&#xff0c;并将 nums[i] 递增 1。 返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。 生成的测试用例保证答案在 32 位整数范围内。 示例 1&#xff1a; 输入&am…

【Hadoop】HDFS基本操作

参考&#xff1a;3.HDFS基本操作_哔哩哔哩_bilibili 创建目录 hadoop fs -mkdir -p /training/qiang查看当前根目录下文件 hadoop fs -ls /hadoop fs -ls /training/目录授权 hadoop fs -chmod -R 777 /training/qm777是最大权限&#xff0c;读写 4、2、1 上传文件 先创…

YZ系列工具之YZ09:VBA_Excel之读心术

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套一部VBA手册&#xff0c;教程分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的…

Python自动化脚本裁剪图片为1:1比例

一、创建输入文件夹&#xff08;in&#xff09;和输出文件夹&#xff08;out&#xff09;&#xff0c;将原始图片放在输入文件夹&#xff08;in&#xff09;里 二、 安装对应的Python库 pip install Pillow 三、编写自动化脚本代码 import os from PIL import Imagedef crop…

Axure RP电商系统商城PC+app+后台买家卖端高保真原型模板及元件库

AxureRP电商商城PCapp后台买家卖端高保真原型模板本套包含三份原型图素材 APP买家端原型简介&#xff1a; 包含了用户中心、会员成长、优惠券、积分、互动社区、运营推广、内容推荐、商品展示、订单流程、订单管理、售后及服务等完整的电商体系功能架构和业务流程。 本模板由…

Spring中ApplicationEvent事件的实现

1&#xff09;简介 Spring Event (接口名为Aplication Event) 观察者设计模式&#xff0c;由事件发起者publisher发布事件&#xff08;指定事件名&#xff09;&#xff0c;事件监听者监听事件&#xff08;指定事件名&#xff09;。 好比&#xff0c; A 说了一句话&#xff0c…

安卓14无法安装应用解决历程

客户手机基本情况&#xff1a; 安卓14&#xff0c;对应的 targetSdkVersion 34 前天遇到了安卓14适配问题&#xff0c;客户发来的截图是这样的 描述&#xff1a;无法安装我们公司的B应用。 型号&#xff1a;三星google美版 解决步骤&#xff1a; 1、寻找其他安卓14手机测试…

从源码到平台:使用视频美颜SDK构建高性能直播美颜系统详解

本文将深入探讨如何从源码出发&#xff0c;借助视频美颜SDK构建一套高性能的直播美颜系统&#xff0c;涵盖技术架构、核心功能的实现以及性能优化等方面的详解。 一、视频美颜SDK的作用与选择 视频美颜SDK是开发直播美颜系统的基础&#xff0c;它能够提供实时美颜处理功能&am…