集合就是把一些有关联的数据放到一起。与list不同的是,集合中的顺序不重要,变换了元素的顺序,仍是同一个集合。集合中的元素是不能重复的。和list类似,集合中的每个元素,也都是string类型。
关于集合的相关命令
sadd/smembers/sismember/scard
sadd:将⼀个或者多个元素添加到 set 中。返回值表示本次成功添加了几个元素。注意,重复的元素⽆法添加到 set 中。
smembers:获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
sismember:判断⼀个元素在不在 set 中。
scard:求set中元素个数。
spop/srandmember
spop:从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。
srandmember:随机获取一个成员,不会删除。
smvoe/srem
smove:将⼀个元素从源 set 取出并放⼊⽬标 set 中。
srem:将指定的元素从 set 中删除。
sinter/sinterstore
sinter:获取给定 set 的交集中的元素。
sinterstore:获取给定 set 的交集中的元素并保存到⽬标 set 中。返回值是交集的元素个数。
sunion/sunionstore/sdiff/sdiffstore
sunion:获取给定 set 的并集中的元素。返回并集的结果。
sunionstore:获取给定 set 的并集中的元素并保存到⽬标 set 中。
sdiff:获取给定 set 的差集中的元素。
sdiffstore:获取给定 set 的差集中的元素并保存到⽬标 set 中。
set类型的内部编码方式
集合类型的内部编码有两种:
• intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置
(默认 512 个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
• hashtable(哈希表):当集合类型⽆法满⾜ intset 的条件时,Redis 会使⽤ hashtable 作为集合
的内部实现。
set类型的应用场景
标签(tag)
集合类型⽐较典型的使⽤场景是标签(tag)。例如 A ⽤⼾对娱乐、体育板块⽐较感兴趣,B ⽤⼾
对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。将标签保存到redis的set中。有了这些数据就可以得到喜欢同⼀个标签的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助。 例如⼀个电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐。
set方便计算交集,很容易就可以找到两个用户之间的公共标签。
计算用户之间的共同好友
还是基于集合求交集,可以计算社交平台中用户之间的共同好友。还可以基于上述做一些好友推荐。A和B是好友,A和C是好友,B和C和D都是好友,系统可以把D推荐给A。
统计UV
一个互联网产品衡量用户量,主要指标有两方面:
1、PV page view 用户每次访问该服务器,每次访问都会产生一个pv。
2、UV user view 每个用户访问服务器,都会产生一个uv,但是同一个用户多次访问,不会使uv增加。uv需要按照用户进行去重。去重过程就可以使用set实现。
以上,关于redis,希望对你有所帮助。