redis:set集合命令,内部编码,使用场景
个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》《C++》《Linux》《网络》 《redis学习笔记》
文章目录
- 前言
- 命令
- SADD
- SMEMBERS
- SISMEMBER
- SCARD
- SPOP
- SMOVE
- SREM
- 集合间操作
- SINTER
- SINTERSTORE
- SUNION
- SUNIONSTORE
- SDIFF
- SDIFFSTORE
- 内部编码
- 使用场景
- 总结
前言
ste集合类型是保存多个字符串类型的元素,但和列表类型不同,集合中元素之间是无序的,元素也不允许重复。
redis除了支持集合内的增删查改操作,同时支持多个集合取交集,并集,差集。
命令
SADD
将一个或者多个元素添加到 set 中。重复元素无法添加到 set 中
SADD key member [ member … ]
返回值:本次添加成功的元素个数
时间复杂度:O(1)
SMEMBERS
获取一个set中所有元素。元素间的顺序是无序的,获取结果的顺序是随机的
SMEMBERS key
返回值:所有元素的列表
时间复杂度:O(N),N为集合元素个数
注意:
如果执行多次smembers命令,获取结果顺序一致,可能有以下原因:
SISMEMBER
判断一个元素在不在 set 中
SISMEMBER key member
返回值:1 表示元素在 set 中;0 表示元素不在 set 中 或者 key 不存在
时间复杂度:O(1),set 集合是通过哈希表来实现的
SCARD
获取一个 set 的基数,即 set 中的元素个数
SCARD key
返回值:set 内元素的个数
时间复杂度:O(1)
SPOP
从 set 中删除并返回一个或者多个元素。由于 set 内的元素是无序的,所以取出哪个元素实际是未定义行为,即spop删除元素就是随机删除
SPOP key [count]
返回值:取出的元素
时间复杂度:O(N),N为count的个数
SMOVE
将一个元素从 source 取出并放入 destrination 中
SMOVE source destrination member
返回值:1 表示移动成功;0 表示失败
时间复杂度:O(1)
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给定的所有集合的总的元素个数
SDIFFSTORE
获取给定 set 的差集中的元素并保存到目标 set 中
SDIFFSTORE destination key [key …]
返回值:差集的元素个数
时间复杂度:O(N),N为给定的所有集合的总元素个数
内部编码
集合类型的内部编码有两种:
- intset(整数集合):当集合中的元素都是整数并且元素的个数小于 set-max-inset-entries 配置时,redis会使用 intset来作为集合的内部实现;intset是一种紧凑的数据结构,专门用于存储整数数值,通过压缩存储,intset能够节省内存空间
- hashtable(哈希表):当集合类型无法 intset 的条件时,redis会使用hashtable作为集合的内部实现;hashtable允许存储各种类型的元素,set集合的每个元素都作为一个字符串对象存储,而对应的值则统一为nullptr
使用场景
- 使用 set 来保存用户的标签;标签也就是用户画像,分析出用户的一些特征,分析清楚特征之后,再投其所好
- 使用 set 来计算用户之间的共同好友;基于 “集合求交集”,A 和 B是好友,B 和 C是好友,B 和 C 和 D都是好友,就可以将D推荐给A
- 使用 set 统计 UV(独立访客数量);每一个用户,访问服务器,都会产生一个 UV,但是同一个用户多次访问,不会是UV增加,UV需要按照用户进行去重
总结
以上就是我的redis学习笔记