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

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.kler.cn/news/315167.html

相关文章:

  • 音视频入门基础:AAC专题(8)——FFmpeg源码中计算AAC裸流AVStream的time_base的实现
  • Qt:静态局部变量实现单例(附带单例使用和内存管理)
  • socket是什么?为什么要用socket?
  • Python 实现图形学几何变换算法
  • 【农信网-注册/登录安全分析报告】
  • (done) 声音信号处理基础知识(5) (Types of Audio Features for Machine Learning)
  • 【Pycharm】Pycharm创建Django提示pip版本需要升级
  • WebLogic 靶场攻略
  • JavaEE: 深入探索TCP网络编程的奇妙世界(二)
  • OpenCL 学习(2)---- OpenCL Platform 和 Device
  • Linux进阶命令-rsync daemon
  • Java :数组array和 Arrays
  • Phoenix使用
  • Zookeeper安装使用教程
  • 爬虫技术抓取网站数据
  • C++进阶|多态知识点详解及经典面试题总结
  • 字节跳动冯佳时:大语言模型在计算机视觉领域的应用、问题和我们的解法
  • java实现系统文件管理
  • 如何在自动化测试中应用装饰器、多线程优化自动化架构?
  • ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案
  • 音视频入门基础:AAC专题(5)——FFmpeg源码中,判断某文件是否为AAC裸流文件的实现
  • OpenCore Legacy Patcher 2.0.0 发布,83 款不受支持的 Mac 机型将能运行最新的 macOS Sequoia
  • 【Web】御网杯信息安全大赛2024 wp(全)
  • 如何在堆和栈上分别创建一个`QObject`子类对象
  • 走在时代前沿:让ChatGPT成为你的职场超级助手
  • 环形链表问题——力扣141,142
  • Facebook运营:账号类型有哪些?有必要用静态住宅IP吗?
  • 快速理解MySQL索引:优化查询性能的利器
  • 动手深度学习 线性回归从零开始实现实例
  • 招商银行招行笔试难度递增?要点解读