Redis_9_Set
Set
提到Set,可能表示多种含义:
1、集合
2、设置(和get对应)
Redis中的集合表示第一种含义,集合就是把一些有关联的数据放到一起~~
1、集合中的元素是无序的
2、集合中国的元素是不能重复的
此处说的无序和前面提到的list这里提到的有序是对应的。
有序:顺序很重要,变换一下顺序,就是不同的list了。
无序:顺序不重要,变换一下顺序,集合还是哪个集合。
list:[1,2,3]和[2,1,3]是两个不同的list
set:[1,2,3]和[2,1,3]是同一个集合
和list类似,集合中的每个元素也都是string类型。(可以使用json这样的格式让string也能存储结构化数据)。
命令
sadd
将一个或者多个元素添加到set中.
SADD key member [member ...]
ps:member 集合中的元素
时间复杂度:O(1)
返回值:本次操作,添加成功了几个元素
smembers
如何查看刚才集合中的元素呢?=》使用smembers即可
SMEMBERS key
时间复杂度:O(N),N是集合元素的个数
返回值:所有元素的列表
sismembers
判断一个元素在不在当前set中。
SISMEMBER key member
时间复杂度:O(1)
返回值:1表示存在,0表示不存在。
scard
获取当前集合中元素的个数。
SCARD key
时间复杂度:O(1)
返回值:当前集合中元素的个数
spop
随机删除列表中的一个/多个元素。
SPOP key [count]
ps:此处的count不写,表示随机删除一个元素;写了则表示删除count个元素。
时间复杂度:删除1个元素时间复杂度为O(1),删除k个元素,时间复杂度为O(k)。
返回值:删除的元素的值,没有则返回空。
此处,官方文档承诺了我们是随机删除。并且官方文档中提到,spop中使用到了“生成随机数”的方式进行实现。
可以看到,每次删除的元素顺序都是随机的:
srandmember
随机获取集合的一个元素
SRANDMEMBER key [count]
时间复杂度:count为1的时候,O(1);count为N的时候,O(N)。
返回值:随机获取到的元素

smove
把member从source删除再插入到destination中。
SMOVE source destination member
时间复杂度:O(1)
返回值:1表示移动成功,0表示失败。

那么如果我给key中再插入一个1再把它插入key2中,会怎么样呢?
针对上述情况,smove不会视为出错,仍然会按照删除-插入进行操作。
那如果要移动的元素在source中不存在呢?
此时就会返回0,表示移动失败了
srem
将指定元素从set中删除。
SREM key member [member ...]
ps:可以一次删除一个member,也可以一次删除多个member。
时间复杂度:O(N),N是要删除的元素个数。
返回值:本次操作删除成功元素个数。
集合间操作
在高中数学的集合中,我们常常要涉及三个概念:交集(inter)、并集(union)、差集(diff)。
交集:最终结果同时出现在两个集合中。
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
sinter
获取给定set的交集中的元素。
SINTER key [key ...]
ps:此处的每个key都对应一个集合。
时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数。
返回值:交集的元素。

sinterstore
获取给定set的交集并放到目标destination中。
SINTERSTORE destination key [key ...]
时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数。
返回值:交集的元素个数。
sunion
获取给定set中并集的元素。
SUNION key [key ...]
时间复杂度:O(N),N是给定所有集合的总元素个数。
返回值:并集的元素。
sunionstore
获取给定set的并集并放到目标destination中。
SUNIONSTORE destination key [key ...]
时间复杂度:O(N),N给定的所有集合的总的元素个数。
返回值:并集的元素个数。
sdiff
获取给定set中差集中的元素。
SDIFF key [key ...]
时间复杂度:O(N),N给定的所有集合的总的元素个数。
返回值:差集元素
sdiffstore
获取给定set的差集并放到目标destination中。
SDIFFSTORE destination key [key ...]
时间复杂度:O(N)
返回值:差集元素个数。

总结
Set的编码方式
1、inset(整数集合)
为了节省空间,做出的特定优化~
当元素均为整数,并且元素个数不是很多的时候,使用整数集合。
2、哈希表
Set的应用场景
1、使用Set来保存用户的“标签”
我们使用的APP会对我们进行一个“用户画像”,所谓“用户画像”就是分析你这个人的一些特征,分析这些特征之后,再投其所好,给你推送一些视频、商品……而这些特征就像一个个的标签存储在集合中,当你登录之后,就从集合中取出一些标签,再根据这些标签的类型,给你进行推送。还有的互联网产品会进行合作,对用户的标签进行取并集,从而更好地进行推送。
2、使用Set来计算用户之间的共同好友
相当于是对一个集合求交集。
比如:A和B是好友。
A和C是好友。
B和C和D是好友。
这三个集合一取交集,系统就会把D推荐给A。
3、使用Set统计uv
什么是uv呢?
一个互联网产品衡量用户规模,主要有两个指标:
1、PV:page view,用户每次访问该服务器,就会产生一个pv。
2、UV:user view,每个用户,访问服务器,都会产生一个uv,但是同一个用户多次访问,不会使uv增加,
uv需要按照用户进行去重,上述去重过程的实现可以使用set。
