当前位置: 首页 > news >正文

Redis数据结构之set

一.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做的


http://www.mrgr.cn/news/33361.html

相关文章:

  • 校园美食导航:Spring Boot技术的美食发现之旅
  • 【416】【举报垃圾信息】
  • 漏洞复现_永恒之蓝
  • MySQL:事务
  • 代码编辑器 —— SourceInsight实用技巧
  • Windows下如何定时执行自定义任务
  • 数据结构—树
  • 学习 git 命令行的简单操作, 能够将代码上传到 Gitee 上
  • 广度/深度优先搜索多维数据的理解
  • 汽车电子零部件(16):ZCU区域控制器
  • Tomcat后台弱口令部署war包
  • Cocos Creator3.x设置动态加载背景图并且循环移动
  • 数字图像面积计算一般方法及MATLAB实现
  • 详解journalctl
  • WinRAR技巧:如何高效制作RAR分卷压缩文件
  • SIP信令的基本流程
  • 江协科技STM32学习- P16 实验-TIM输出比较(PWD驱动LED呼吸灯,舵机,直流电机)
  • VisionPro - 基础 - 模板匹配技术和在VP中的使用 - PMAlign - PatMax (5)- 非线性模板变形匹配
  • java自动解析apk安装包内容信息
  • 2.个人电脑部署MySQL,傻瓜式教程带你拥有个人金融数据库!