(一).概念
Set,表示“集合”。集合,指的就是把一些有关联的数据放到一起。对于集合来说,集合中的元素是无序的,并且集合中的元素也是不能重复的。Set和list类似,集合中的每个元素都是String类型的,同样,也可以使用json这样的格式让string来存储结构化的数据。
(二).命令
1.sadd
将一个或者多个元素添加到set中。对于重复的元素,是无法添加到set中的。
语法:sadd key member [member......]
时间复杂度:O(1)
返回值:本次添加成功的元素个数

2.smembers
获取一个set中的所有元素,元素之间的顺序是无序的。
语法:smembers key
时间复杂度:O(N)
返回值:所有元素的列表

3.sismember
判断一个元素在不在set中
语法:sismember key member
时间复杂度:O(1)
返回值:1表示元素在set中。0表示元素不在set中或者key不存在

4.scard
获取一个set的基数,即set中的元素个数
语法:scard key
时间复杂度:O(1)
返回值:set内的元素个数

5.spop
从set中删除并返回一个或者多个元素。由于set内的元素是无序的,所以取出那个元素实际上是未定义行为,即可以看作是随机的。在redis的源码中,采用的是生成随机数的方式进行删除元素
语法:spop key [count]
时间复杂度:O(N),N指的是count
返回值:取出的元素

6.smove
将一个元素从源set取出并放入目标set中
语法:smove source destination member
把member从source上删除,再插入到destination中
时间复杂度:O(1)
返回值:1表示移动成功,0表示失败


原本key1中有1,key2中也有1,但是当执行smove命令的时候,redis不会视为是出错,依旧会按照 “删除---插入”的命令进行执行
7.srem
将指定的元素从set中删除
语法:srem key member [member......]
时间复杂度:O(N),N表示要删除的元素个数
返回值:本次操作删除的元素个数


8.集合间操作
集合间操作,指的是交集(inter),并集(union),差集(diff)




(1).sinter 和 sinterstore
sinter:
获取给定set的交集中的元素
语法:sinter key [key ......]
时间复杂度:O(M*N),N是最小的集合元素的个数,M是最大的集合元素个数
返回值:交集的元素

sinterstore:
获取给定set的交集中的元素并保存到目标set中
语法:sinterstore destination key [key....]
时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合的元素个数
返回值:交集的元素个数

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

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

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

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

(三).内部编码
1.intset
intset指的是“整数集合”,当集合中的元素都是整数,并且元素的个数都小于指定配置数(默认512)的时候,redis会选用intset来作为集合的内部实现,从而减少内存的使用。

2.hashtable
当集合类型无法满足intset的条件的时候,redis会使用hashtable作为集合的内部实现。

(四).使用场景
1.使用set来保存用户的“标签”
有一个专业性名词叫做“用户画像”。即分析出某个用户的一些特征,然后根据这些特征,进行投其所好。例如,“抖音”的自动推荐。
set很方便的计算交集,很容易找到两个用户之间的公共标签,基于这样的标签,衍生出一系列的“用户关系”。
2.使用set来计算用户之间的共同好友
实现思路就是“基于集合求交集”。
例如,QQ。用户A 这边加了很多好友,用户B也加了很多好友。基于上述,就可以做一些好友推荐。
3.使用set统计UV
主要的目的是进行“去重”。
对于一个互联网产品,衡量用户量主要是通过两个指标
一个是PV 一个是UV
PV(page view)指的是,用户每次访问该服务器,每次访问都会产生一个PV
UV(user view)指的是,每个用户访问服务器,都会产生一个uv,但是同一个用户进行多次访问,不会使uv增加。uv需要按照用户进行去重,所以可以使用set来实现。




被折叠的 条评论
为什么被折叠?



