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

文章目录

  • [一、Set 类型介绍](#一、Set 类型介绍)
  • [二、Set 类型相关命令](#二、Set 类型相关命令)
    • [2.1 添加元素和检查成员](#2.1 添加元素和检查成员)
    • [2.2 移除元素](#2.2 移除元素)
    • [2.3 集合运算](#2.3 集合运算)
    • [2.4 Set 相关命令总结](#2.4 Set 相关命令总结)
  • [三、Set 类型编码方式](#三、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:将一个或多个成员添加到集合中。

    语法:

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

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

    语法:

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

    语法:

    shell 复制代码
    SCARD key

2.2 移除元素

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

    语法:

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

    语法:

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

    语法:

    shell 复制代码
    SREM key member [member ...]

2.3 集合运算

求交集

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

    语法:

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

    语法:

    shell 复制代码
    SINTERSTORE destination key [key ...]

求并集

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

    语法:

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

    语法:

    shell 复制代码
    SUNIONSTORE destination key [key ...]

求差集

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

    语法:

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

    语法:

    shell 复制代码
    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对历史、新闻感兴趣,这些兴趣点可以被抽象为标签。

    shell 复制代码
    SADD user:1:tags entertainment sports
    SADD user:2:tags history news

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

  2. 给标签添加用户

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

    shell 复制代码
    SADD entertainment:users user:1
    SADD sports:users user:1
    SADD history:users user:2
    SADD news:users user:2

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

  3. 删除用户下的标签

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

    shell 复制代码
    SREM user:1:tags sports

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

  4. 删除标签下的用户

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

    shell 复制代码
    SREM sports:users user:1

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

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

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

    shell 复制代码
    SINTER user:1:tags user:2:tags

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

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

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

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

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

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

相关推荐
炽天使5 分钟前
aws rds-mysql不支持性能详情监控
linux·数据库·mysql·云计算·aws·rds
得物技术23 分钟前
基于Redis内核的热key统计实现方案|得物技术
redis
Allen Bright41 分钟前
Redis主从架构
数据库·redis·架构
ZHOU西口1 小时前
MySQL系列之远程管理(安全)
数据库·mysql·安全·tls·加密连接·require_secure
fcopy1 小时前
Golang项目:实现生产者消费者模式
缓存·golang
Karoku0661 小时前
【docker集群应用】Docker网络与资源控制
运维·数据库·docker·容器
2301_793086871 小时前
springboot+redis+lua实现分布式锁
spring boot·redis·lua
扬子鳄0082 小时前
Spring Boot自动配置机制
java·数据库·spring boot
秋意钟2 小时前
sql漏洞
数据库·oracle
cdut_suye2 小时前
C++11新特性探索:Lambda表达式与函数包装器的实用指南
开发语言·数据库·c++·人工智能·python·机器学习·华为