文章目录
- 前置知识
- 常见命令
- SADD
- SMEMBERS
- SISMEMBER
- SCARD
- SPOP
- SMOVE
- SREM
- 集合间操作
- SINTER
- SINTERSTORE
- SUNION
- SUNIONSTORE
- SDIFF
- SDIFFSTORE
- 命令小结
- 内部编码
- 测试内部编码
- 使用场景
前置知识
集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,在集合当中:
- 集合当中的元素之间是⽆序的
- 集合当中的元素之间不可以重复
- ⼀个集合中最多可以存储232 - 1个元素
- Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集
常见命令
SADD
将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中
语法:SADD key member [member ...]
返回值:本次添加成功的元素个数 时间复杂度:O(1)
SMEMBERS
获取⼀个set中的所有元素,注意,元素间的顺序是⽆序的
语法:SMEMBERS key
返回值:所有元素的列表 时间复杂度:O(N)
SISMEMBER
判断⼀个元素在不在set中
语法:SISMEMBER key member
返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在 时间复杂度:O(1)
SCARD
获取⼀个set的基数(cardinality),即set中的元素个数
语法:SCARD key
返回值:set内的元素个数 时间复杂度:O(1)
SPOP
从set中删除并返回⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以删除哪个元素实际是未定义⾏为,即可以看作随机的
语法:SPOP key [count] #count:要删除的元素个数,随机删除
返回值:取出的元素 时间复杂度:O(N),n是count
SMOVE
将member从source上删除,再插入到destination当中
语法:SMOVE source destination member
返回值:1表⽰移动成功,0表⽰失败 时间复杂度:O(1)
注意:如果要移动的元素不再source当中,那么此时返回0,表示移动失败
SREM
将指定的元素从set中删除,额可以一次删除一个/多个
语法:SREM key member [member ...]
返回值:本次操作删除成功的元素个数 时间复杂度:O(N),N是要删除的元素个数
集合间操作
交集、并集、差集的概念
交集:最终结果同时出现在两个集合当中的元素
A:1 2 3 4 B:3 4 5 6 A和B的交集为:3 4
并集:将多个集合当中的数据集中放在一起,如果元素有重复,最终只保留一份
A:1 2 3 4 B:3 4 5 6 A和B的并集为:1 2 3 4 5 6
差集:A和B做差集,就是找出在A集合当中存在,在B集合当中不存在的元素
A:1 2 3 4 B:3 4 5 6 A和B的差集为:1 2 B和A的差集:5 6
SINTER
获取给定set的交集中的元素
语法:SINTER key [key ...] #此处的每个key对应一个集合
返回值:交集的元素 时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数
注意:1个或者多个set取交集
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给定的所有集合的总的元素个数
注意:返回的结果是第一个集合中存在而第二个集合(后面集合)中不存在的元素,所以key的顺序很重要
SDIFFSTORE
获取给定set的差集中的元素并保存到⽬标set中
语法:SDIFFSTORE destination key [key ...]
返回值:差集的元素个数 时间复杂度:O(N),N给定的所有集合的总的元素个数
命令小结
内部编码
集合类型的内部编码有两种:
intset
(整数集合):当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries
配置(默认512个)时,Redis会选⽤intset
来作为集合的内部实现,从⽽减少内存的使⽤hashtable
(哈希表):当集合类型⽆法满⾜intset
的条件时,Redis会使⽤hashtable
作为集合的内部实现
测试内部编码
1)当元素个数较少并且都为整数时,内部编码为intset
2)当元素个数超过512个,内部编码为hashtable
:
3)当存在元素不是整数时,内部编码为hashtable
使用场景
1.集合类型⽐较典型的使⽤场景是标签
例如A⽤⼾对娱乐、体育板块⽐较感兴趣,B⽤⼾对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助
- 例如⼀个电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐
2.计算用户之间的共同好友 => 集合当中求交集
3.使用set统计UV
进行去重
一个互联网产品如何衡量用户量和用户规模
1.PV-page view
:用户每次访问该服务器,每次访问都会产生一个PV
2.UV-user view
:每个哟关乎访问服务器都会产生一个uv
,但是同一个用户多次访问,不会使uv
增加,uv需要按照用户进行去重