一.set集合特性
集合类型也是保存多个字符串类型的元素的,但和list列表不一样,集合中的元素是无序的,而且元素不能够重复,不仅支持增删查改,还支持交集并集等操作
二.相关命令
1.sadd
sadd key members……
咱们把集合中的元素叫做member(和hash中的field要区分开)
一次可以添加多个元素
返回值是元素个数
时间复杂度O(1)
2.smembers
smembers key 获取集合中的元素,是无序的
时间复杂度O(N)
3.sismember
sismember key member 判断一个元素在不在集合中
时间复杂度O(1)
返回1表示在,返回0表示不在
4.scard
scard key 获取一个集合中的基数(cardinality),即set中的元素个数
时间复杂度O(1)
5.spop
spop key (count) 从中删除并返回一个或者多个元素。但注意,由于set内部的元素是无序的,所以不知道哪个元素是末尾,所以取出哪个元素实际上是未定义行为,即是随机的
时间复杂度:O(N),N就是count
如果构造一个set,按照1234的顺序插入元素,pop的结果会是啥,我们无法得知
6.smove
smove source destination member 把member从source上删除,再插入到destination中
如果要移动的元素再source中不存在,就会返回0
7.srem
srem key member[member……] 一次删除一个或多个member'
返回值是删除成功的个数
8.sinter
sinter key [key……]求交集,返回值是最终交集的数据
O(M*N)
9.sinterstore
sinterstore destination key[key……]将得到的交集放到destination中
10.sunion sunionstore
sunion key [key……]求并集
sunionstore同上
O(N)
11.sdiff sdiffstore
sdiff是求差集
O(N)
上述集合简单操作的时间复杂度的求法涉及到了集合内部的源码实现
三.内部编码
intset:整数集合,当集合中元素都是整数并且个数小于set-max-inset-entries时,就会用intset
hashtable:哈希表,除上述之外的都是用哈希表
四.使用场景
1.使用set来保存用户标签
例如:A用户对娱乐板块感兴趣,B对体育板块感兴趣,这些兴趣点就可以被抽象成标签。有了这些数据,就可以得到喜欢同一个标签的用户,也可以得到用户共同喜欢的标签,这些事u据对于增强用户体验等都有非常大的帮助
1.给用户添加标签
sadd user:1:tags tag1 tag2 tag3……
2.给标签添加用户
sadd tag:1:users user1 user2……
3.删除用户下的标签
srem user:2:tags tag3 tag5
4.删除标签下的用户
srem tag:3:users user1 user45
5.计算共同的兴趣
sinter user:1:tags user:4:tags
这其实就是给用户画像:分析清楚你这个人的特征,分析清楚后再投其所好~千人千面。
1.根据用户的历史行为,看出一个用户的性别、年龄、爱好……。上述数据,很多公司共享(俩个程序,两个账号,咋知道这是一个人?现在的程序登录入口,就俩,一个微信一个手机号)。通过上述过程,搜集到用户的特征,就会转换成标签(简短的字符串),此时就可以把标签保存到redis的set中
2.使用set计算用户间的共同好友
基于集合求交集
基于此还能做好友推荐
A和B是好友,A和C是好友,BCD是好友,所以系统会将D推荐给A
3.使用set统计UV
一个互联网产品,如何衡量用户量用户规模?主要指标就是两方面
PV、UV
PV是page view UV是user view,用户每访问一次服务器就会产生一个pv,每个用户访问服务器都会产生一个uv,但是同一个用户访问多次,不会使得uv增加
uv按照用户去重,就是set做的