Redis---Set

(一).概念

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来实现。

上一篇: SpringCloud---Consul
下一篇: SpringCloud---Sentinel
懒惰的小房.
博客等级 码龄2年 70粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值