关注推送---Feed流,推模式实现的个人分析及其思考。

本篇文章记录我们实际开发过程中,关注推送场景的个人思考,以及解析。

文章目录

  • 前言
  • 一、关注推送是什么?是什么是Feed流?
  • 二、解决关注推送问题的技术方案
    • 1.理论模型的选取
    • 2.数据类型的选取
  • 三、理论模型的选取
  • 三、数据类型的选取
  • 总结


前言

⁣⁣⁣⁣ ⁣⁣⁣⁣ 本篇文章记录我们实际开发过程中,关注推送场景的个人思考理解,以及解析,包括其设计、方案的选取,要注意点等等。 注意哦!!!本文不涉及具体代码、业务,只是写出个人的一些理解,和思路。


一、关注推送是什么?是什么是Feed流?

⁣⁣⁣⁣ ⁣⁣⁣⁣ 这里大家脑海里面可能没有太多的印象,啥也不说了,上图我们说。
在这里插入图片描述
⁣⁣⁣⁣ ⁣⁣⁣⁣ 大家可以看到上面这个图,这里就是随便举例去说明的。

⁣⁣⁣⁣ ⁣⁣⁣⁣ 关注推送使用场景:比如我们关注的这个人,再发动态信息的时候,我们能及时得到通知,去通知所有关注了这个用户的人,让他们都知道,那这个功能就叫做关注推送了,那它还有个名字叫做Feed流

下面再去介绍一下什么是Feed流?
在这里插入图片描述
⁣⁣⁣⁣ ⁣⁣⁣⁣  📃 ✏️传统模式:就是几年前那时候还没有什么抖音之类的,那时候我们要想获取一些信息,用户往往都需要自己去检索,通过什么搜索引擎,百度贴吧去寻找各种各样的内容,然后自己去思考、分析、鉴别,看看什么样的内容才是自己真正想要的。强调的是用户主动。

⁣⁣⁣⁣ ⁣⁣⁣⁣ 📃 ✏️ 但是Feed流则恰好相反,它不需要用户去找内容,而是由我们的应用程序,自动的根据用户行为去匹配,更适合用户的内容直接推到你面前(so:抖音的根据你喜欢刷的视频类型,主动推送同类型视频继续给你),那于是用户就减少了自己查找,还有思考和分析的这样一个过程了,可以大大的节省用户的时间!!!大家也可以写一些算法,去控制推送。


OK,到这里,大家脑海中就有一些场景了。




二、解决关注推送问题的技术方案


我个人认为需要解决下面两个问题:

1.理论模型的选取

2.数据类型的选取




三、理论模型的选取

他的实现方案有3种:
 ⁣⁣⁣⁣ ⁣⁣⁣⁣  ⁣⁣⁣⁣ ⁣⁣⁣⁣  ⁣⁣⁣⁣ ⁣⁣⁣⁣  1.拉模式
 ⁣⁣⁣⁣ ⁣⁣⁣⁣  ⁣⁣⁣⁣ ⁣⁣⁣⁣  ⁣⁣⁣⁣ ⁣⁣⁣⁣  2.推模式
 ⁣⁣⁣⁣ ⁣⁣⁣⁣  ⁣⁣⁣⁣ ⁣⁣⁣⁣  ⁣⁣⁣⁣ ⁣⁣⁣⁣  3.推拉模式

⁣⁣⁣⁣ ⁣⁣⁣⁣ 经过比对和实践,我个人还是比较建议使用推模式,下面就去介绍推模式。其他模式大家感兴趣也可以搜索一下,考虑到实际应用场景,实现难度等等问题,所以我就不介绍了。

⁣⁣⁣⁣ ⁣⁣⁣⁣ ⚠️⚠️⚠️推模式也叫写扩散,比方说现在有两个up主张三和李四,假如说有3个粉丝,收件箱还是要有的,现在呢粉丝1关注了张三,粉丝2关注了张三和李四,粉丝3也关注了张三和李四,假设说现在张三要发消息,他又没有发件箱,这里当一个用户要发一个消息的时候,这些消息,会直接推送到他的所有粉丝的收件箱里去,所以叫推模式,直接推过去了,发送消息的没有发件箱,那么这个消息就写了好几份了!他有几个粉丝就写几份,那同样李四要来发消息呢,也是一样,推送给他的粉丝,然后对收件箱里的消息做一个排序。
在这里插入图片描述

⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 那这个时候我们的粉丝想要来读的时候,那直接拿到的就是完整的消息了,并且是排序好的,还不需要临时去拉取和排序了,那因此它的延时就非常的低!!!
 ⁣⁣⁣⁣ ⁣⁣⁣⁣ 但是呢他也有自己的缺点,你发消息的时候没有发件箱了,你不得不把这消息发给每一个粉丝,写给每一个人,那要写了好几份!所以呢这种消息的扩散方式,不是通过读的时扩散,而是在发的时候直接写给他们了,所以他就写扩散。
  ⁣⁣⁣⁣ ⁣⁣⁣那正因为此呢,它的内存占用会比较高,一个消息要写n份,我们假设说这个张三是个大v,他有成千上万的粉丝,你像那个什么微博里面有些大v啊上亿粉丝,那不得了,你这一个消息发出去要保存上亿分,那就炸了!!!所以这是它的一个缺点


⁣⁣⁣⁣ ⁣⁣⁣⁣ ✔️✔️✔️OK,解决第一个问题!!!我们推送的理论模型选取问题。


三、数据类型的选取

⁣⁣⁣⁣ ⁣⁣⁣⁣ 每当有用户发消息的时候,都要直接推送到所有粉丝的收件箱当中,那在咱们的业务当中消息动态,因此每当用户发布一个新的消息动态时,我们就应该把消息动态推送到他粉丝的收件箱,到时候粉丝一刷新,就能获取最新的信息动态。

⁣⁣⁣⁣ ⁣⁣⁣⁣ 实现收件箱那这里怎么选择数据结构呢
 ⁣⁣⁣⁣ ⁣⁣⁣⁣在redis中List、SortedSet数据类型都可以去排序,一个按照插入的元素有序性可以满足我们这里的时间戳排序功能,一个可以按照sorce去排序!!!但是我们收件箱还要实现一个功能就是可以实现分页查询!!!那我们知道,分页往往要指定起始的角标 ,算出来我从哪开始到哪结束!那我们的redis里的list是一个链表,它底层是有角标的,所以说它是可以按角标查询的!因此呢它完全可以实现分页查询!!!而我们的SortedSet它没有角标!不过呀,SortedSet他在排序完成以后!它有一个叫排名的概念,就是你是排第一名还是第二名,第三名,它是可以按照排名作为查询条件的,他排名它是从零开始,0、1、2、3、其实跟角标一个效果呀!!所以说他也能实现分页!!! 这个其实就是用到其数据结构的特点,所以大家一定要熟练掌握,才能更好的应用。

在这里插入图片描述

⁣⁣⁣⁣ ⁣⁣⁣⁣ 在Feed流当中我们的数据是会不断变化的,因为不断的有人在发新的消息,于是呢就会不断的消息进入到我们这个队列里,那么这个排名啊就会不断的变化,那因此角标呢也在变化,这时候如果你还是采用传统的分页模式,就有问题了!!!由于数据变化,你在读取某一段数据之后,这个时候又插入新的数据,这个时候角标又发生变化了,你在按照之前的角标读,就可能存在重复读取的情况!!!如下图:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

⁣⁣⁣⁣ ⁣⁣⁣⁣ 滚动分页模式其实就是记录每一次查询的最后一条,下一次呢从这个位置开始查,这就叫滚动分页了。他的查询不依赖角标!!!

⁣⁣⁣⁣ ⁣⁣⁣⁣ 因为我们这里的顺序是有序的,所以说我们完全可以按照顺序,每次记住最后一条是什么,下一次从它往后查!!!你这个每次记住上一次查询的最后一条,那我查询的开始位置也要记下来!!我们是倒序从大到小,那我们查询的开始位置,完全可以把起始的这个id,指定成无穷大或者说时间戳也行。这也就变成了,不是按照角标查询!!!

⁣⁣⁣⁣ ⁣⁣⁣⁣ 所以这就是滚动分页的实现原理,这是因为他的查询不依赖于角标,所以呢他就不会Feed的流中数据变化、角标变化带来的影响。

⁣⁣⁣⁣ ⁣⁣⁣⁣ ⚡⚡⚡上面一段话,要明白,这个对于我们理解下面数据结构的选取非常重要。

⁣⁣⁣⁣ ⁣⁣⁣⁣ 我们的List结构支持这种滚动分页吗? 显然不行!因为在List里我们查询数据,只能按照角标查询,所以说呢List不支持滚动分页!!!而SortedSet它会按照score值排序,然后有一个排名,如果你按照排名查询,那跟角标查询没什么区别!!!但是呢我们的SortedSet,还支持按照score值范围进行查询,那我们的score值就是我们时间戳,我们把时间戳按从大到小的顺序做个排列,每一次查询的时候,我都记住最小的那个时间戳,然后下次查询时我再找比这个时间戳更小的,这样就实现了滚动分页了,那数据呢也就不会重复了,那么因此最终胜出的是SortedSet!!!!所以我们采用的是 SortedSet数据结构!!!

⁣⁣⁣⁣ ⁣⁣⁣⁣ ⚠️⚠️⚠️所以大家记住了,如果你的数据会有变化的情况下,那尽量不要使用List这种队列去做分页,而是使用SortedSet,那同样你以后做排行榜的话,你也要注意这一点!!!利用的就是其数据结构的特性!!!

⁣⁣⁣⁣ ⁣⁣⁣⁣ OK,到这里!!!我们的数据结构确定了,选择SortedSet数据结构!!!!







✅✅✅ok,到这里我们,理论模型的选用推模式,数据类型的选用SortedSet数据结构,至此我们关注推送模式其实2个核心东西全部确定了!!!




总结


⁣⁣⁣⁣ ⁣⁣⁣⁣ 注意哦!!!本文不涉及具体代码、业务,只是写出个人的一些理解,和思路。


 ⁣⁣⁣⁣ ⁣⁣⁣⁣根据上面的思路,其实结合我们的业务,可以去完成对应的代码设计,代码这一部分其实就要看个人了,下一节的话,我会给我我的代码,供大家去参考的,这一节内容过多,就不展示自己写的代码了。


 ⁣⁣⁣⁣ ⁣⁣⁣⁣感谢大家的支持!!! ⁣⁣⁣⁣ ⁣⁣⁣⁣ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473555.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

前端八股文 对$nextTick的理解

$nexttick是什么? 获取更新后的dom内容 为什么会有$nexttick ? vue的异步更新策略 (这也是vue的优化之一 要不然一修改数据就更新dom 会造成大量的dom更新 浪费性能) 这是因为 message (data)数据在发现变化的时候,vue 并不会立刻去更…

echarts阶段仪表图

echarts阶段仪表图 – 效率图 1、先上效果展示 2、完整源码奉上 Vue2 echarts 5 <template><div ref"gaugeChart" style"width: 100%; height: 100%"></div> </template><script> import * as echarts from "echar…

智能化客户服务:提升效率与体验的新模式

在数字化浪潮的推动下&#xff0c;客户服务领域正经历着一场深刻的变革。智能化客户服务的兴起&#xff0c;不仅重塑了企业与客户之间的互动方式&#xff0c;更在提升服务效率与增强客户体验方面展现出了巨大潜力。本文将深入探讨智能化客户服务的新模式&#xff0c;分析其如何…

Arc for Windows 无法使用?一篇文章教会你!

&#x1f44b; 大家好&#xff0c;我是 Beast Cheng &#x1f4eb; 联系我&#xff1a;458290771qq.com &#x1f331; 接合作、推广…… 什么是Arc浏览器&#xff1f; Arc浏览器是The Browser Conpany使用Swift语言开发的一款浏览器&#xff0c;Arc浏览器由其漂亮的侧边栏闻名…

上万组风电,光伏,用户负荷数据分享

上万组风电&#xff0c;光伏&#xff0c;用户负荷数据分享 可用于风光负荷预测等研究 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码&#xff1a;381i 获取链接&#x1f517; https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…

vue2响应式原理+模拟实现v-model

效果 简述原理 配置对象传入vue实例 模板解析&#xff0c;遍历出所有文本节点&#xff0c;利用正则替换插值表达式为真实数据 data数据代理给vue实例&#xff0c;以后通过this.xxx访问 给每个dom节点增加观察者实例&#xff0c;由观察者群组管理&#xff0c;内部每一个键值…

django高校教务系统-计算机毕业设计源码81661

目 录 摘要 1 绪论 1.1 研究背景 1.2目的及意义 1.3论文结构与章节安排 2 高校教务系统设计分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4…

【云WAF为您的Web防御保驾护航】

在这个数字时代&#xff0c;网络就像是一张没有尽头的大网&#xff0c;将整个世界都联系在了一起。但是&#xff0c;在这个网络的背后&#xff0c;却潜藏着数不清的安全隐患。恶意攻击、数据泄漏、网站瘫痪……各种隐患就像是隐藏在暗处的毒蛇&#xff0c;时刻都会对没有任何防…

金蝶云苍穹-插件开发(一)加载数据

前言 此系列博客是进行金蝶云苍穹开发时的插件开发的教程&#xff0c;一是在明年要是还要参加软件杯金蝶A6赛题的话&#xff0c;可以看此系列教程的博客来进行复习&#xff0c;同时如果要是我实验室的学弟学妹要参加的话&#xff0c;我这个系列的博客可以给他们提供学习参考&a…

破解宇宙终极奥秘,战胜昊天无上束缚

在幽邃的暗夜下&#xff0c;细品着夫子与昊天跨越千年的智勇交锋&#xff0c;我的思绪不禁飘向了更加深远的宇宙边际&#xff0c;回响起那些关于人类如何挑战天命、战胜上天的过往。 宇宙奥秘 在浩瀚无垠的宇宙深渊中&#xff0c;隐藏着一段超越凡尘的规则。昊天&#xff0c;…

2024/7/6 英语每日一段

More than half of late-teens are specifically calling for more youth work that offers “fun”, with older teenagers particularly hankering for more jollity, according to a study carried out by the National Youth Agency. One in 10 said they have zero option…

【Go】excelize库实现excel导入导出封装(四),导出时自定义某一列或多列的单元格样式

大家好&#xff0c;这里是符华~ 查看前三篇&#xff1a; 【Go】excelize库实现excel导入导出封装&#xff08;一&#xff09;&#xff0c;自定义导出样式、隔行背景色、自适应行高、动态导出指定列、动态更改表头 【Go】excelize库实现excel导入导出封装&#xff08;二&…

AI Earth应用—— 在线使用sentinel数据VV和VH波段进行水体提取分析(昆明抚仙湖、滇池为例)

AI Earth 本文的主要目的就是对水体进行提取,这里,具体的操作步骤很简单基本上是通过,首页的数据检索,选择需要研究的区域,然后选择工具箱种的水体提取分析即可,剩下的就交给阿里云去处理,结果如下: 这是我所选取的一景影像: 详情 卫星: Sentinel-1 级别: 1 …

新产品或敏捷项目过程 SOP,附带流程图及流程规范

一、项目启动 项目背景和目标明确 市场调研结果分析&#xff0c;确定新产品的需求和市场机会。制定明确的项目目标&#xff0c;包括产品特性、上市时间、预期收益等。 组建项目团队 确定项目经理、产品经理、开发人员、测试人员、市场人员等角色。明确各成员的职责和权限。 项目…

Java语言程序设计基础篇(第10版)编程练习题13.18(使用 Rational 类)

第十三章第十八题(使用 Rational 类) 题目要求&#xff1a; 编写程序&#xff0c;使用 Rational 类计算下面的求和数列: 你将会发现输出是不正确的 &#xff0c;因为整数溢出(太大了)。为了解决这个问题 &#xff0c;参见编程练习題13.15。代码参考&#xff1a; package cha…

蜂窝物联农业气象站,守护丰收每一步

现代农业的革新者——农业自动气象站&#xff0c;正以其多功能的传感器、高效的数据采集传输系统、智能的数据云平台以及可靠的供电供网系统&#xff0c;成为农业生产中的得力助手。这些传感器能够实时监测温度、湿度、风速、风向、气压、土壤温度、土壤湿度、土壤PH值、土壤盐…

CorelDRAW2024新版本来咯!你的设计神助手

&#x1f389; 设计界的朋友们&#xff0c;注意啦&#xff01;你们的新宠——CorelDRAW 2024 来咯&#xff01; &#x1f31f; 一、设计神器再进化 亲爱的设计小伙伴们&#xff0c;有没有感觉每天与那些不配合的软件战斗&#xff0c;像是在打怪升级&#xff1f;&#x1f409; …

Selenium的这些自动化测试技巧你知道几个?

Selenium自动化测试技巧 与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少…

js的作用域链

function test(){} 运行期上下文&#xff1a;当函数执行时&#xff0c;会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境&#xff0c;函数每次执行时对应的执行上下文都是 独一无二的&#xff0c;所以多次调用一个函数对导致创建多个执行上下…

leetcode力扣_排序问题

215.数组中的第K个最大元素 鉴于已经将之前学的排序算法忘得差不多了&#xff0c;只会一个冒泡排序法了&#xff0c;就写了一个冒牌排序法&#xff0c;将给的数组按照降序排列&#xff0c;然后取nums[k-1]就是题目要求的&#xff0c;但是提交之后对于有的示例显示”超出时间限制…