[Redis][Set]详细讲解

目录


0.前言

  • 集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是:

    • 集合中元素之间是⽆序的
    • 集合中元素不允许重复
  • 一个集合中最多可以存储 2 32 − 1 2^{32} - 1 232−1个元素

  • Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题


1.常用命令

1.SADD

  • 功能 :将⼀个或者多个元素添加到set中
    • 注意 :重复的元素⽆法添加到set中
  • 语法 :SADD key member [member ...]
  • 返回值 :本次添加成功的元素个数
  • 时间复杂度 : O ( 1 ) O(1) O(1)

2.SMEMBERS

  • 功能 :获取一个set中的所有元素
    • 注意:元素间的顺序是无序的
  • 语法 :SMEMBERS key
  • 返回值:所有元素的列表
  • 时间复杂度 : O ( N ) O(N) O(N)

3.SISMEMBER

  • 功能 :判断一个元素在不在set中
  • 语法 :SISMEMBER key member
  • 返回值 ::
    • 1 :表⽰元素在set中
    • 0 :表⽰元素不在set中或者key不存在
  • 时间复杂度 : O ( 1 ) O(1) O(1)

4.SCARD

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

5.SPOP

  • 功能 :从set中删除并返回⼀个或者多个元素
    • 注意 :由于set内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的
  • 语法 :SPOP key [count]
  • 返回值:取出的元素
  • 时间复杂度 : O ( N ) O(N) O(N),N是count

6.SMOVE

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

7.SREM

  • 功能 :将指定的元素从set中删除
  • 语法 :SREM key member [member ...]
  • 返回值:本次操作删除的元素个数
  • 时间复杂度 : O ( N ) O(N) O(N),N是要删除的元素个数

2.集合间操作

0.是什么?

  • set支持交集(inter)、并集(union)、差集(diff)

1.SINTER

  • 功能 :获取给定set的交集中的元素
  • 语法 :SINTER key [key ...]
  • 返回值:交集的元素
  • 时间复杂度 : O ( N ∗ M ) O(N*M) O(N∗M),N是最⼩的集合元素个数,M是最⼤的集合元素个数

2.SINTERSTORE

  • 功能 :获取给定set的交集中的元素并保存到目标set中
  • 语法:`SINTERSTORE dest key key ...
  • 返回值:交集的元素个数
  • 时间复杂度 : O ( N ∗ M ) O(N*M) O(N∗M),N是最⼩的集合元素个数,M是最⼤的集合元素个数

3.SUNION

  • 功能 :获取给定set的并集中的元素
  • 语法 :SUNION key [key ...]
  • 返回值:并集的元素
  • 时间复杂度 : O ( N ) O(N) O(N),N给定的所有集合的总的元素个数

4.SUNIONSTORE

  • 功能 :获取给定set的并集中的元素并保存到⽬标set中
  • 语法 :SUNIONSTORE dest key [key ...]
  • 返回值:并集的元素个数
  • 时间复杂度 : O ( N ) O(N) O(N),N给定的所有集合的总的元素个数

5.SDIFF

  • 功能 :获取给定set的差集中的元素
  • 语法 :SDIFF key [key ...]
  • 返回值:差集的元素
  • 时间复杂度 : O ( N ) O(N) O(N),N给定的所有集合的总的元素个数

6.SDIFFSTORE

  • 功能 :获取给定set的差集中的元素并保存到目标set中
  • 语法 :SDIFFSTORE dest key [key ...]
  • 返回值:差集的元素个数
  • 时间复杂度 : O ( N ) O(N) O(N),N给定的所有集合的总的元素个数

3.内部编码

1.intset(整数集合)

  • 当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries配置(默认512个)时,Redis会选⽤intset来作为集合的内部实现,从⽽减少内存的使⽤

2.hashtable(哈希表)

  • 当集合类型⽆法满⾜intset的条件时,Redis会使⽤hashtable作为集合的内部实现

4.使用场景

  • 集合类型⽐较典型的使⽤场景是标签(tag)
    • 例如:⼀个电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐
  • 示例 :
    • 给用户添加标签

      bash 复制代码
      sadd user:1:tags tag1 tag2 tag5
      sadd user:2:tags tag2 tag3 tag5
      ...
      sadd user:k:tags tag1 tag2 tag4
    • 给标签添加用户

      bash 复制代码
      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
    • 删除用户下的标签

      bash 复制代码
      srem user:1:tags tag1 tag5
      ...
    • 删除标签下的用户

      bash 复制代码
      srem tag1:users user:1
      srem tag5:users user:1
      ...
    • 计算⽤⼾的共同兴趣标签

      bash 复制代码
      sinter user:1:tags user:2:tags

相关推荐
这个DBA有点耶5 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G5 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备5 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远5 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
IT大白鼠5 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz5 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
2601_962218615 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
全栈弄潮儿²⁰²⁴5 天前
AI Agent 开发实战(30):限流、缓存与成本控制
人工智能·gpt·缓存·agent·限流·agi·成本控制
张洛闻Eren5 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安5 天前
MySQL-触发器
数据库·mysql