目录
一,基本情况
二,常用命令
2.1 sadd
2.2 smembers,sismember
2.3 spop,srandmember
2.3 smove,srem
2.4 sinter,sinterstore求交集
2.5 sunion,sunionstore求并集
2.6 sdiff,sdiffstore求差集
三,内部编码
四,应用场景
4.1 标签
4.2 共同好友
4.3 统计UV
一,基本情况
set表示含义叫做“集合”,一个术语可能有多种含义,比如:set有“集合”的含义,也有“设置”的含义。
集合就是把一些有关联的数据放到一起,有下面几个特点:
- 集合中的元素是“无序”的,这里的“无序”是和list对应的,有序还是无序,关键就在于元素顺序是否重要
- 集合中的元素不能重复,这点和list也是相反的
- 和list类似,集合中的每个元素也都是string类型(我们也可以用json的格式让set存结构化数据)
二,常用命令
官方命令文档传送门:Commands | Docs (redis.io)
2.1 sadd
SADD key member [member ...]
sadd是set add的缩写,也就是往set里面添加元素,我们一般把集合里的元素叫做 “member”,每个member都是一个string字符串
2.2 smembers,sismember
smembers作用是获取一个set里的是所有元素,是无序的;sismember作用是判断一个元素是否在set里
集合的操作都是带有“ S ”前缀的,判定当前元素是否在集合中
2.3 spop,srandmember
pop一般表示“从末尾”删除一个元素,由于集合中的元素是无序的,此时“哪一个元素是末尾”就无关紧要了,使用spop删除元素的时候,是“随机删除”;srandmember作用是“随机”从key中获取一个数
spop key [count] #其中当count不写的时候,随机删除一个;写的时候,写几个删几个
注意:官方文档保证,spop每次删除时,都是随机的,因为在源码中实现spop可执行程序时,就采用了生成随机数的方式:
2.3 smove,srem
smove source destination member
smove作用是把 member 从 source 上删除,再插入到 destination 中,两个都是set类型,当source没有member时,smove返回0;srem作用是删除指定的member,可以一次删除多个
smove:
当set1有1时,再从set2移动一个1过来,但是由于元素不能重复,虽然smove会返回1表示插入成功,但是set2只有一个1,set1的1被删除
srem:
2.4 sinter,sinterstore求交集
set既然称为“集合”,那么也应该有集合的功能,比如数学里的“交集”,“并集”,“差集”,Redisset类型也支持这几个操作,并且效果和数学一致:
sinter key [key...]
sinter表示获取给定的set中交集的元素,每个key都对应一个set集合,返回值就是最终交集的数据
sinterstore destination key [key...]
sinterstore作用也是求交集,但是它直接把算好的交集放进一个destination 这个 key 对应的集合中
注意:如果key已经存在,再写入会覆盖原先的集合里的元素:
2.5 sunion,sunionstore求并集
sunion作用是获取给定的set并集中的元素,返回值为并集结果;sunionstore和上面的sinterstore一样,也是将结果存到指定key的集合中:
2.6 sdiff,sdiffstore求差集
sdiff作用是求差集,用法也和上面的一样;sdiffstore也是一样的:
三,内部编码
- intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置 (默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。(为了节省空间,做出的特定优化)
- hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合 的内部实现。
四,应用场景
4.1 标签
使用set来保存用户的“标签”(tag)
例如 A用户对娱乐、体育板块比较感兴趣,B用户对历史、新闻比较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签的人,以及用户的共同喜好的标签,这些数据对于增强用户体验和用户黏度都非常有帮助。 例如⼀个 电子商务网站会对不同标签的用户做不同的产品推荐。
这里说的标签,就是一些简短的字符串,此时就可以把标签保存到Redis的set中了
“用户画像”,这种事情其实是挺复杂的事情,一般的大厂都会有专门的团队做这样的工作,用来准确描述一个人的喜好等
上面的玩法,某音是玩得最好得,其他互联网大厂一看,也都纷纷效仿和跟进 --> 信息茧房 --> 你看到的东西都是你愿意看到的,你不愿意看的就很难被你看到 --> 你看到的内容始终是一个小圈子 --> 到处传递焦虑的,当你很认真看了一个焦虑视频之后,人家服务器就判定,你非常爱看这种类型的视频,然后就给你狂推送
4.2 共同好友
set还有一个用处,就是使用set来计算用户之间的共同好友,就是“基于求交集”
比如QQ就有时候显示“您与***有多个共同好友,点击查看详情”之类的显示
4.3 统计UV
一个互联网产品,如何衡量用户量,用户规模?
主要有两方面:
- PV:page view,比如我打开必应,搜索一个东西,中间的每次点击,都会产生这样一个PV,简单来说就是用户每次访问这个服务器都会产生一个PV
- UV:PV是针对一个用户的,UV就是每个用户,访问服务器,都会产生一个UV,但是同一个用户多次访问服务器,UV也不会增加了;所以UV需要按照用户进行去重,所以我们就可以使用set来实现。