Redis - Set 集合

发布于:2024-04-28 ⋅ 阅读:(164) ⋅ 点赞:(0)

目录

前言

命令

SADD 将一个或者多个元素添加到 set 中

语法

SMEMBERS 获取一个 set 中的所有元素

语法

SISMEMBER 判断⼀个元素在不在 set 中

语法

SCARD 获取 set 中的元素个数

语法

SPOP 从 set 中随机删除并返回⼀个或者多个元素

语法

SMOME 将⼀个元素从源 set 取出并放入目标 set 中

语法

SREM 将指定的元素从 set 中删除

语法

SINTER 获取给定 set 的交集中的元素

语法

SINTERSTORE 获取给定 set 的交集中的元素并保存目标 set 中

语法

SUNION 获取给定 set 的并集中的元素

语法

SUNIONSTORE 获取给定 set 的并集中的元素并保存到目标 set 中

语法

SDIFF 获取给定 set 的差集中的元素

语法

SDIFFSTOR  获取给定 set 的差集中的元素并保存到目标 set 中

语法

内部编码

使用场景

一.存储标签

二.存储用户好友

三.统计 UV


前言

        集合类型可保存多个字符串类型的元素,但和列表类型不同的是,集合中的元素之间是⽆序的(顺序不重要,变换一下集合中的数据顺序,集合不会发生改变) 的并且元素不允许重复

        ⼀个集合中最多可以存储 2^32-1 个元素。Redis 除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题。

命令

SADD 将一个或者多个元素添加到 set 中

注意,重复的元素⽆法添加到 set 中。

语法

SADD key member [member ...]

时间复杂度:O(1)  

返回值:本次添加成功的元素个数。

        因为集合中不会存储相同的数据,所以会对插入的数据进行去重,插入 1 1 2 3,实际上插成功 1 2 3,3个数据

SMEMBERS 获取一个 set 中的所有元素

语法

SMEMBERS key

时间复杂度:O(N)

返回值:列表中的所有元素

SISMEMBER 判断⼀个元素在不在 set 中

语法

SISMEMBER key member

时间复杂度:O(1)

返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在

SCARD 获取 set 中的元素个数

语法

SCARD key

时间复杂度:O(1) 

返回值:set 内的元素个数。

SPOP 从 set 中随机删除并返回⼀个或者多个元素

        pop 一般表示从末尾删除一个元素,但集合中的元素是无序的,所以并不清楚哪个元素在末尾,相当于随机删除一个或多个元素(在源码中对)

语法

SPOP key [count]

时间复杂度:O(N),n 是 count 

返回值:取出的元素。

SMOME 将⼀个元素从源 set 取出并放入目标 set 中

语法

SMOVE source destination member

时间复杂度:O(1)

返回值:1 表⽰移动成功,0 表⽰失败。

SREM 将指定的元素从 set 中删除

        可以一次删除一个元素,也可以一次删除多个元素

语法

SREM key member [member ...]

时间复杂度:O(N), N 是要删除的元素个数.

返回值:本次操作删除的元素个数。

SINTER 获取给定 set 的交集中的元素

语法

SINTER key [key ...]

时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.

返回值:交集的元素。

SINTERSTORE 获取给定 set 的交集中的元素并保存目标 set 中

语法

SINTERSTORE destination key [key ...]

时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.

返回值:交集的元素个数。

SUNION 获取给定 set 的并集中的元素

语法

SUNION key [key ...]

时间复杂度:O(N), N 给定的所有集合的总的元素个数

返回值:并集的元素

SUNIONSTORE 获取给定 set 的并集中的元素并保存到目标 set 中

语法

SUNIONSTORE destination key [key ...]

时间复杂度:O(N), N 是给定的所有集合的总的元素个数.

返回值:并集的元素个数

SDIFF 获取给定 set 的差集中的元素

语法

SDIFF key [key ...]

时间复杂度:O(N), N 给定的所有集合的总的元素个数

返回值:差集的元素

SDIFFSTOR  获取给定 set 的差集中的元素并保存到目标 set 中

语法

SDIFFSTORE destination key [key ...]

时间复杂度:O(N), N 给定的所有集合的总的元素个数

返回值:差集的元素个数

内部编码

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

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

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

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

使用场景

一.存储标签

        集合类型⽐较典型的使⽤场景是标签(tag),例如 A ⽤户对娱乐、体育板块⽐较感兴趣,B ⽤户对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。

        为什么集合适合存储标签呢?因为标签是不在乎顺序的,用户喜欢打篮球和旅游,这两个标签是不需要区分顺序的,这与集合的无效性相对应。一个用户相同的标签只用存储一份即可,比如用户喜欢打篮球,只需要存储一份喜欢打篮球的标签即可,不需要存多份,这与集合中的元素不允许重复相对应。

        而且由于集合可以很好的支持交并操作,所以可以很方便的分析两个用户之间的共同爱好,还可以知道用户更喜欢哪些方面,这些数据对于增强⽤户体验和⽤户黏度都⾮常有帮助。例如⼀个 电⼦商务⽹站会对不同标签的⽤户做不同的产品推荐。

二.存储用户好友

        存储用户好友,方便分析用户之间的共同好友(通过求交集)

三.统计 UV

        一个互联网产品怎么衡量用户量,用户规模?主要的指标是两方面:PV,UV

        PV:页面浏览量,每次访问服务器都会产生一个 PV

        UV:用户浏览量,每个用户访问服务器都会产生一个 UV ,但一个用户的多次访问不会使 UV 增加,所以要对用户的访问信息进行去重,同一个用户的访问信息只记录一次,这个去重的操作就可以由 set 实现

        


网站公告

今日签到

点亮在社区的每一天
去签到