Redis Set集合命令、内部编码及应用场景(详细)

news2025/6/7 13:37:53

文章目录

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

前言

集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中
1)元素之间是无序
2)元素不允许重复,如下图所示。一个集合中最多可以存储 2 32 − 1 2^{32} - 1 2321 个元素。
Redis除了支持集合内的增删查改操作,同时还支持多个集合取 交集并集差集

集合类型
在这里插入图片描述


普通命令

SADD

SADD key member [member ...]

将一个或者多个元素添加到 set 中。注意,重复的元素 无法添加 到set中。
时间复杂度:O(1)
返回值:本次添加成功的元素个数。

 redis> SADD myset "Hello"
 (integer) 1
 redis> SADD myset "World"
 (integer) 1
 redis> SADD myset "World"
 (integer) 0
 redis> SMEMBERS myset
 1) "Hello"
 2) "World"

SMEMBERS

SMEMBERS key

获取一个set中的 所有元素,注意,元素间的顺序是 无序 的。
时间复杂度:O(N)
返回值:所有元素的列表。

 redis> SADD myset "Hello"
 (integer) 1
 redis> SADD myset "World"
 (integer) 1
 redis> SMEMBERS myset
 1) "Hello"
 2) "World"

SISMEMBER

SISMEMBER key member

判断一个元素在不在set中
时间复杂度:O(1)
返回值:1 表示元素在set中。0 表示元素不在 set 中或者 key 不存在。

 redis> SADD myset "one"
 (integer) 1
 redis> SISMEMBER myset "one"
 (integer) 1
 redis> SISMEMBER myset "two"
 (integer) 0

SCARD

SCARD key

获取一个set的基数(cardinality),即set中的 元素个数
时间复杂度:O(1)
返回值:set内的 元素个数

redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2

SPOP

SPOP key [count]

从set中删除并返回一个或者多个元素。注意,由于set内的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作随机的。
时间复杂度:O(N),n是count
返回值:取出的元素

redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SPOP myset
"one"
redis> SMEMBERS myset
1) "three"
2) "two"
redis> SADD myset "four"
(integer) 1
redis> SADD myset "five"
(integer) 1
redis> SPOP myset 3
1) "three"
2) "four"
3) "two"
redis> SMEMBERS myset
1) "five"

SMOVE

SMOVE source destination member

将一个元素从 源set 取出并放入 目标set 中。
时间复杂度:O(1)
返回值:1 表示移动成功,0 表示失败

 redis> SADD myset "one"
 (integer) 1
 redis> SADD myset "two"
 (integer) 1
 redis> SADD myotherset "three"
 (integer) 1
 redis> SMOVE myset myotherset "two"
 (integer) 1
 redis> SMEMBERS myset
 1) "one"
 redis> SMEMBERS myotherset
 1) "three"
 2) "two"

SREM

SREM key member [member ...]

将指定的元素从set中删除。
时间复杂度:O(N), N是要删除的元素个数.
返回值:本次操作删除的元素个数

 redis> SADD myset "one"
 (integer) 1
 redis> SADD myset "two"
 (integer) 1
 redis> SADD myset "three"
 (integer) 1
 redis> SREM myset "one"
 (integer) 1
 redis> SREM myset "four"
 (integer) 0
 redis> SMEMBERS myset
 1) "three"
 2) "two"

集合间操作

交集(inter)、并集(union)、差集(diff)的概念如下图所示

集合求交集、并集、差集
在这里插入图片描述


SINTER

SINTER key [key ...]

获取给定set的交集中的元素
时间复杂度:O(N*M), N是最小的集合元素个数.M是最大的集合元素个数
返回值:交集的元素。

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
  redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SINTER key1 key2
 1) "c"


SINTERSTORE

SINTERSTORE destination key [key ...]

获取给定set的 交集 中的元素并 保存 到 目标set中
时间复杂度:O(N*M), N是最小的集合元素个数.M是最大的集合元素个数.
返回值:交集的元素个数

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SINTERSTORE key key1 key2
 (integer) 1
 redis> SMEMBERS key
 1) "c"


SUNION

SUNION key [key ...]

获取给定set的 并集 中的元素
时间复杂度:O(N),N给定的所有集合的总的元素个数.
返回值:并集的元素。

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SUNION key1 key2
 1) "a"
 2) "c"
 3) "e"
 4) "b"
 5) "d"

SUNIONSTORE

SUNIONSTORE destination key [key ...]

获取给定set的 并集 中的元素并保存到 目标set 中
时间复杂度:O(N), N给定的所有集合的总的元素个数.
返回值:并集的元素个数

redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SUNIONSTORE key key1 key2
 (integer) 5
 redis> SMEMBERS key
 1) "a"
 2) "c"
 3) "e"
 4) "b"
 5) "d"

SDIFF

SDIFF key [key ...]

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

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFF key1 key2
1) "a"
2) "b"

SDIFFSTORE

SDIFFSTORE destination key [key ...]

获取给定set的 差集 中的元素并保存到 目标set 中
时间复杂度:O(N),N给定的所有集合的总的元素个数
返回值:差集的元素个数

redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFFSTORE key key1 key2
(integer) 2
redis> SMEMBERS key
 1) "a"
 2) "b"

命令小结

在这里插入图片描述


内部编码

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

  • intset(整数集合):当集合中的元素都是整数并且元素的个数小于 set-max-intset-entries 配置(默认512个)时,Redis会选用 intset 来作为集合的内部实现,从而减少内存的使用。
  • hashtable(哈希表):当集合类型无法满足 intset 的条件时,Redis会使用 hashtable 作为集合的内部实现。

(1) 当元素个数较少并且都为整数时,内部编码为intset

127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset"

(2) 当元素个数超过512个,内部编码为 hashtable

 127.0.0.1:6379> sadd setkey 1 2 3 4
 (integer) 513
 127.0.0.1:6379> object encoding setkey
 "hashtable"

(3) 当存在元素不是整数时,内部编码为 hashtable

127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"hashtable"

使用场景

集合类型比较典型的使用场景是标签(tag)。
例如A用户对娱乐、体育板块比较感兴趣,B用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同一个标签的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。
例如一个电子商务网站会对不同标签的用户做不同的产品推荐

通过集合类型来实现标签的若干功能

(1) 给用户添加标签

sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4

(2) 给标签添加用户

sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28

(3) 删除用户下的标签

srem user:1:tags tag1 tag5
...

(4) 删除标签下的用户

srem tag1:users user:1
srem tag5:users user:1
...

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

sinter user:1:tags user:2:tags

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

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

相关文章

C++算法动态规划1

DP定义: 动态规划是分治思想的延申,通俗一点来说就是大事化小,小事化无的艺术。 在将大问题化解为小问题的分治过程中,保存对这些小问题已经处理好的结果,并供后面处理更大规模的问题时直接使用这些结果。 动态规划具…

KaiwuDB在边缘计算领域的应用与优势

KaiwuDB 在边缘计算场景中主要应用于 工业物联网(IIoT)、智能电网、车联网 等领域,通过其分布式多模架构和轻量化设计,在边缘侧承担 数据实时处理、本地存储与协同分析 的核心作用。以下是具体案例和功能解析: 1. 典型…

鸿蒙开发List滑动每项标题切换悬停

鸿蒙开发List滑动每项标题切换悬停 鸿蒙List滑动每项标题切换悬停,功能也很常见 一、效果图: 二、思路: ListItemGroup({ header: this.itemHead(secondClassify, index) }) 三、关键代码: build() {Column() {List() {ListIt…

ubuntu开机自动挂载windows下的硬盘

我是ubuntu和windows的双系统开发,在ubuntu下如果想要访问windows的硬盘,需要手动点击硬盘进行挂载,这个硬盘我每次编译完都会使用,所以用下面的步骤简化操作,让系统每次开机后自动挂载。 第一步. 确定硬盘的设备标识…

使用 Golang `testing/quick` 包进行高效随机测试的实战指南

使用 Golang testing/quick 包进行高效随机测试的实战指南 Golang testing/quick 包概述testing/quick 包的功能和用途为什么选择 testing/quick 进行测试快速入门:基本用法导入 testing/quick 包基本使用示例:快速生成测试数据quick.Check 和 quick.Val…

32 C 语言字符处理函数详解:isalnum、isalpha、iscntrl、isprint、isgraph、ispunct、isspace

1 isalnum() 函数 1.1 函数原型 #include <ctype.h>int isalnum(int c); 1.2 功能说明 isalnum() 函数用于检查传入的整数参数是否为 ASCII 编码的字母或数字字符&#xff08;A - Z、a - z、0 - 9&#xff0c;对应 ASCII 值 65 - 90、97 - 122、48 - 57&#xff09;。…

Qt实现一个悬浮工具箱源码分享

一、效果展示 二、源码分享 hoverToolboxWidget.h #ifndef HOVERTOOLBOXWIDGET_H #define HOVERTOOLBOXWIDGET_H#include <QWidget> #include <QMouseEvent> #include <QPropertyAnimation> #include <QStyleOption> #include <QPainter>namespa…

线夹金具测温在线监测装置:电力设备安全运行的“隐形卫士”

在电网系统中&#xff0c;线夹金具是连接导线与输电塔架的关键部件&#xff0c;其运行状态直接影响电力传输的稳定性。传统人工巡检方式存在效率低、盲区多、数据滞后等问题&#xff0c;而线夹金具测温在线监测装置的普及&#xff0c;正为电力设备运维带来革新。 一、工作原理&…

《TCP/IP 详解 卷1:协议》第4章:地址解析协议

ARP 协议 地址解析协议&#xff08;ARP, Address Resolution Protocol&#xff09;是IPv4协议栈中一个关键的组成部分&#xff0c;用于在网络层的IP地址与数据链路层的硬件地址&#xff08;如MAC地址&#xff09;之间建立映射关系。它的主要任务是&#xff1a; 将32位的IPv4地…

Windows下运行Redis并设置为开机自启的服务

下载Redis-Windows 点击redis-windows-7.4.0下载链接下载Redis 解压之后得到如下文件 右键install_redis.cmd文件&#xff0c;选择在记事本中编辑。 将这里改为redis.windows.conf后保存&#xff0c;退出记事本&#xff0c;右键后选择以管理员身份运行。 在任务管理器中能够…

网络编程之网络基础

基础理论&#xff1a;IP、子网掩码、端口号、字节序、网络基础模型、传输协议 socket&#xff1a;TCP、UDP、广播、组播、抓包工具的使用、协议头、并发服务器 Modbus协议 、HTTP协议、HTML、 分析服务器 源码、数据库 一、认识网络 网络&#xff1a;实现多设备通信 二、IP地址…

Spring AI(11)——SSE传输的MCP服务端

WebMVC的服务器传输 支持SSE&#xff08;Server-Sent Events&#xff09; 基于 Spring MVC 的服务器传输和可选的STDIO运输 导入jar <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-server-webmvc</a…

计算机网络备忘录

计算机网络 - 网络互联与互联网 计算机网络重点学习本章&#xff0c;属于核心知识 包含网络层和传输层 的 相关协议 计算机网络层次重点掌握网络层与传输层。其中网络层主要是IP协议&#xff0c;解决主机-主机通信&#xff0c;传输层主要是TCP/UDP 协议&#xff0c;解决应用-…

Spring Boot论文翻译防丢失 From船长cap

本文内容 微服务 微服务风格的特性组件化&#xff08;Componentization &#xff09;与服务&#xff08;Services&#xff09;围绕业务功能的组织产品不是项目强化终端及弱化通道分散治理分散数据管理基础设施自动化容错性设计设计改进 微服务是未来吗其它 微服务系统多大微…

NuxtJS入门指南:环境安装及报错解决

在学习NuxtJS的过程中&#xff0c;正确的安装环境是非常重要的一步。然而&#xff0c;有时候在安装过程中会遇到一些问题&#xff0c;比如使用corepack安装pnpm时出现的错误。本文将详细介绍如何安装NuxtJS以及解决上述安装过程中遇到的问题。 Nuxt.js简介 Nuxt.js是一个强大的…

贪心算法应用:集合划分问题详解

贪心算法与集合划分问题详解 集合划分问题是组合优化中的经典问题&#xff0c;其核心目标是将元素集合划分为若干满足特定条件的子集。本文将深入探讨贪心算法在集合划分中的应用&#xff0c;涵盖算法原理、适用场景、Java实现细节及优化策略。 一、集合划分问题定义 1.1 基础…

数论~~~

质数 质数Miller-Rabin算法质因子分解质数筛埃氏筛欧拉筛如果只是计数&#xff0c;埃氏筛改进 快速幂乘法快速幂矩阵快速幂1维k阶实战(提醒&#xff1a;最好在mul函数中作乘法时加上&#xff08;long long&#xff09;的强制类型转换 &#xff0c;或者全部数组换成long long&am…

web第十次课后作业--Mybatis的增删改查

&#xff08;一&#xff09;删除操作 功能&#xff1a;根据主键删除数据 SQL 语句 -- 删除id17的数据 delete from emp where id 17;Mybatis 框架让程序员更关注于 SQL 语句 接口方法 Mapper public interface EmpMapper {//Delete("delete from emp where id 17&qu…

贪心算法应用:集合覆盖问题详解

贪心算法与集合覆盖问题详解 贪心算法在组合优化问题中展现出独特优势&#xff0c;集合覆盖问题&#xff08;Set Cover Problem&#xff09;是其中的经典案例。本文将用2万字全面解析贪心算法在集合覆盖/划分中的应用&#xff0c;涵盖算法原理、正确性分析、Java实现、复杂度证…

【知识点】第7章:文件和数据格式化

文章目录 知识点整理文件概述文件的打开和关闭文件的读操作文件的写操作 练习题填空题选择题​​ 知识点整理 文件概述 文件是一个存储在辅助存储器上的数据序列&#xff0c;可以包含任何数据内容。概念上&#xff0c;文件是数据的集合和抽象&#xff0c;类似地&#xff0c;函…