2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景

目录

引言

Set 类型基本概念

 Set 基本操作命令

SADD

SMEMBERS

SISMEMBER

SPOP

SRANDMEMBER

SCARD

SMOVE

SREM

集合间操作命令

交集

SINTER

SINTERSTORE

并集

SUNION 

SUNIONSTORE

差集

SDIFF

SDIFFSTORE

Set 编码方式

Set 的应用场景

用户画像

共同好友

统计 UV(去重)


引言

  • 谈到一个术语,往往该术语很可能有多种含义

实例理解

  • set
  1. 可理解为 集合
  2. 也可理解为 设置,与 GET 相对应

注意:

  • Set 类型中不同命令的返回值,含义差别大且乱

原则:

  • 不要刻意地背,而是多翻 Redis 官方文档,那些经常用的命令,久而久之就记住了

Set 类型基本概念

  • Redis 中的 Set 类型表示为一个 集合
  • 而 集合就是将一些有关联的数据放到一起

特点:

  • 集合中的元素是无序的
  • 集合中的元素是不能重复,即集合中的元素具有唯一性
  • 集合中的每个元素均为 String 类型,可使用 JSON 格式让 String 类型存储结构化数据

注意:

  • 此处 Set 类型的无序 与 List 类型的有序 相互对应

理解:

  • 无序:顺序不重要,变化一下顺序,集合还是那个集合
  • 有序:顺序很重要,变换一下顺序,就是不同的列表了

实例理解

  • List 类型 [1,2,3] 和 [2,1,3] 为两个不同的列表
  • Set 类型 [1,2,3] 和 [2,1,3] 为同一个集合

 Set 基本操作命令

SADD

  • 用来将一个或多个元素 添加到 set 中
  • 重复元素无法添加

语法:

sadd key member [member ...]

时间复杂度:

  • O(N)
  • 其中 N 为添加成员的数量,一般不会特别大,可看成 O(1)

返回值:

  • 本次操作添加成功的元素个数

 实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第1张图片


SMEMBERS

  • 用于获取一个 set 中的所有元素
  • 返回的 元素顺序是无序的

语法:

smembers key

时间复杂度:

  • O(N)
  • 其中 N 为集合中元素的数量

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第2张图片


SISMEMBER

  • 用于 判断在 set 中是否存在指定元素 

语法:

sismember key member

时间复杂度:

  • O(1)

返回值:

  • 返回 1 代表存在
  • 返回 0 代表不存在

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第3张图片


SPOP

  • 用于从 set 中随机删除一个或多个元素

语法:

spop key [count]
  • 未设置 count 时,表示随机删除一个元素
  • 设置了 count 时,表示随机删除 count 个元素

时间复杂度:

  • O(1)

返回值:

  • 返回随机删除的元素

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第4张图片

  • Redis 官方在 spop 命令的源码中,采取 生成随机数 的方式,来实现从 set 中随机删除元素

SRANDMEMBER

  • 用于从 set 中随机获取一个或多个元素
  • 该命令区别于 spop 命令,其不会将获取到的元素从 set 中删除

语法:

srandmember key [count]

时间复杂度:

  • O(1)

返回值:

  • 未设置 count 参数,该命令将从 set 中随机返回一个元素
  • 设置了 count 参数且 count 为正数,则返回的成员中包含 count 个不同的元素
  • 设置了 count 参数且 count 为负数,则返回的元素可能重复,且其绝对值表示返回元素的数量

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第5张图片


SCARD

  • 用于 获取指定 set 中的元素个数

语法:

scard key

时间复杂度:

  • O(1)

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第6张图片


SMOVE

  • 用于将一个元素从源 set 取出并放入目标 set 中 

语法:

smove source destination member
  • 把 member 从 source 上删除,再插入到 destination 中

时间复杂度:

  • O(1)

返回值:

  • 返回 1 表示移动成功
  • 返回 0 表示移动失败

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第7张图片

  • 如上图所示,key 对应的 set 集合成功删除元素1
  • 且该元素也成功插入到了 key2 对应的 set 集合中

补充一:

  • 如果我给 key 里面再添加一个 元素 1,并再次把这个 元素 1 移动给 key2 会怎么样?
  • 注意此时 key2 中已经包含有元素1 了!

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第8张图片

  • 针对上述的情况 smove 命令并不会报错
  • 同样也会按照 删除 插入 执行来执行该命令
  • 但是对于 key2 来说,并不会再次插入一个重复的元素

补充二:

  • 如果要移动的元素在 source 中不存在呢?

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第9张图片

  • 此时 smove 命令便会返回 0 表示移动失败

SREM

  • 用于删除指定 set 中的 一个或多个 member

语法:

srem key member [member ...]

时间复杂度:

  • O(N)
  • N 是要删除的元素个数

返回值:

  • 表示删除成功的元素个数

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第10张图片

集合间操作命令

  • 交集(inter)、并集(union)、差集(diff)

交集

  • 最终结果同时出现在两个集合中

SINTER

  • 用于获取给定 set 的交集中的元素

语法:

sinter key [key ...]
  • 此处每个 key 均对应一个集合
  • 有多个 key 就求这多个 key 之间的交集

时间复杂度:

  • O(N*M)
  • N 为最小集合 的元素个数
  • M 为最大集合 的元素个数

返回值:

  • 最终交集的结果元素

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第11张图片


SINTERSTORE

  • 用于获取给定 set 的交集中的元素,并将这些元素保存到目标 set 中

语法:

sinterstore destination key [key ...]
  • 直接将算好的交集放到 destination 对应的集合中

返回值:

  • 交集的元素个数

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第12张图片

  • 要想知道集合的内容,直接使用 smembers 命令访问 destination 即可

并集

  • 把多个集合中的数据集中放到一起
  • 如果元素有重复,也最终只保留一份

SUNION 

  • 用于获取给定 set 的并集中的元素

语法:

sunion key [key ...]

时间复杂度:

  • O(N)
  •  N 为给定所有集合的总元素个数

返回值:

  • 最终并集的结果元素

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第13张图片


SUNIONSTORE

  • 用于获取给定 set 的并集中的元素,并将这些元素保存到目标 set 中

语法:

sunionstore destination key [key ...]
  • 直接将算好的并集放到 destination 对应的集合中

时间复杂度:

  • O(N)
  •  N 为给定所有集合的总元素个数

返回值:

  • 并集的元素个数

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第14张图片


差集

  • A 和 B 做差集,就是找出哪些元素,在 A 中存在,同时在 B 中不存在

SDIFF

  • 用于获取给定 set 的差集中的元素

语法:

sdiff key [key ...]

时间复杂度:

  • O(N)
  •  N 为给定所有集合的总元素个数

返回值:

  • 最终差集的结果元素

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第15张图片


SDIFFSTORE

  • 用于获取给定 set 的差集中的元素,并将这些元素保存到目标 set 中

语法:

sdiffstore destination key [key ...]
  • 直接将算好的差集放到 destination 对应的集合中

时间复杂度:

  • O(N)
  •  N 为给定所有集合的总元素个数

返回值:

  • 差集的元素个数

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第16张图片

Set 编码方式

  • 集合的内部编码有 两种
  1. intset(整数集合)
  2. hashtable(哈希表)

注意:

  • intset 编码方式是为了节省空间而做出的特定优化
  • 即 当元素均为整数,且元素个数不是很多的时候,将使用 intset 编码

实例理解

2023.12.30 关于 Redis 数据类型 Set 常用命令、内部编码、应用场景_第17张图片

Set 的应用场景

用户画像

  • 指根据用户的个人信息、行为、偏好等数据,通过分析和整理而形成的关于用户的详细描述

重点理解:

  • 我们可以将收集到的用户特征转换成标签,并将其保存到 Redis 中的 Set 类型
  • 标签为一些简短的字符串,比如 性别、年龄、居住地、爱好 等
  • 由此我们便可根据该用户的标签,实现更精准地提供个性化的产品、服务和推广活动

补充:

  • 不同的用户,其商业价值具有一定差别,就比如 该用户是否愿意花钱
  • 该点 可根据用户的一些历史行为,进行分析总结

实例理解

  • 抖音在该方面尤为突出
  • 收集你的用户特征,并推送符合相关特征的短视频内容

共同好友

  • 基于 Set 类型的 "集合求交集"
  • 由此便能够很容易地 找到两个用户之间的共同好友

实例理解

  • QQ 的添加好友页面,经常存在 相关好友推荐
  • 这些好友推荐 通常会显示出 我  与 该用户之间存在多少个共同好友

统计 UV(去重)

  • 一个互联网产品,如果需要衡量用户量、用户规模,通常有两个重要指标
  1. PV(page view)表示页面浏览量,即用户每次打开页面就记录一次 PV,无论是否为同一用户
  2. UV(user view)表示独立访客数,即每个访客仅计算一次,无论其访问了多少个页面

重点理解:

  • UV 需要按照用户进行去重,即我们可以利用 Set 类型自带的去重机制来满足该需求

你可能感兴趣的:(Redis,redis,数据库,缓存)