关注推送---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.mzph.cn/bicheng/41889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Appium+python自动化(四十一)-Appium自动化测试框架综合实践 - 即将落下帷幕(超详解)

1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。到今天为止,大功即将告成;框架所需要的代码实现都基本完成。 2.data数据封装 2.1使用背景 在实际项目过程中,我们的数据可能是存储在一个数据文件中&#x…

最小代价生成树实现(算法与数据结构设计)

课题内容和要求 最小代价生成树的实现,分别以普利姆算法和克鲁斯卡尔算法实现最小代价生成树,并分析两种算法的适用场合。 数据结构说明 普利姆算法实现最小代价生成树的图采用邻接表存储结构,还有辅助数据结构,数组nearest&am…

SR-IOV学习笔记

参考&#xff1a;《深入浅出DPDK》&前人的各种博客 SR-IOV全称Single Root IO Virtualization&#xff0c;单根虚拟化(多么高大上的名字>.<)&#xff0c;是 Intel 在 2007年提出的一种基于硬件的虚拟化解决方案。 虚拟化背景 那什么又是虚拟化呢&#xff1f;抽象来…

gptoolbox matlab工具箱cmake 调试笔记

一、问题描述 起因&#xff1a;在matlab中运行Offset surface of triangle mesh in matlab的时候报错&#xff1a; 不支持将脚本 signed_distance 作为函数执行: E:\MATLAB_File\gptoolbox\mex\signed_distance.m> 出错 offset_bunny (第 22 行) D signed_distance(BC,V,F…

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…

HDF4文件转TIF格式

HDF4 HDF4&#xff08;Hierarchical Data Format version 4&#xff09;是一种用于存储和管理机器间数据的库和多功能文件格式。它是一种自描述的文件格式&#xff0c;用于存档和管理数据。 HDF4与HDF5是两种截然不同的技术&#xff0c;HDF5解决了HDF4的一些重要缺陷。因此&am…

【硬件产品经理】硬件产品手板设计

目录 简介 硬件手板 手板资料 作者简介 简介 今天来聊聊产品手板这个话题。 到了手板这个层面其实就属于产品设计细节了&#xff0c; 无论你对整个开发体系如何如何了解&#xff0c; 对公司管理流程如何如何精通。 最终都是要回归到业务细节中去的&#xff0c; 你可能…

Python中解决os.listdir命令读取文件乱序问题方法

Python中使用对话框批量打开文件时出现乱序问题的解决方法 一、问题描述二、os.listdir读取文件乱序问题解决方法 欢迎学习交流&#xff01; 邮箱&#xff1a; z…1…6.com 网站&#xff1a; https://zephyrhours.github.io/ 一、问题描述 有时候为了方便&#xff0c;我们在进…

Docker-基础

一&#xff0c;Docker简介&#xff0c;功能特性与应用场景 1.1 Docker简介 Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化&#xff0c;容器…

vue计算属性 computed

计算属性 computed 模板语法的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃肿&#xff0c;难以维护。因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。 模板语法&#xff1a;模板语法链接 <template…

表单自定义组件 - 可选择卡片SelectCard

import React from react; import styles from ./index.module.less;type OptionsType {/*** 每个item渲染一行&#xff0c;第0项为标题*/labels?: any[];/*** 自定义渲染内容*/label?: string | React.ReactNode;value: any; }; interface IProps {value?: any;onChange?…

【C++】B树及其实现

写目录 一、B树的基本概念1.引入2.B树的概念 二、B树的实现1.B树的定义2.B树的查找3.B树的插入操作4.B树的删除5.B树的遍历6.B树的高度7.整体代码 三、B树和B*树1.B树2.B*树3.总结 一、B树的基本概念 1.引入 我们已经学习过二叉排序树、AVL树和红黑树三种树形查找结构&#x…

vue事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template> <buttonclick"addCount">点击</button><p>count is: {{ count }}</p><p>{{ coutent_e }}</p> </template> <script>expor…

关于HTTP的攻击实验

实验原理&#xff1a;1. 根据ARP中间人攻击&#xff0c;获取 用户和服务器之间的数据2. 将获取到的数据 通过一定的技术来复原&#xff0c;进而获取用户的信息或者 相关权限实验拓扑图 将 kali 的网卡改为桥接模式&#xff0c;查看Kali和本机的ip 启动ettercap&#xff0c;…

【Python学习】流程控制、函数与类详解

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言&#xff0c;提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

阿里云OSS文件上传不配置环境变量使用显式AccessKey验证

问题背景 在中阿里云官方文档中介绍文件上传时&#xff0c;推荐配置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。这里用简单的方法&#xff0c;直接在Demo.java中显式指定accessKeyId和accessKeySecret&#xff0c;同时修改OSSClientBuilder()的入参。 解决方法 首先…

C语言 -- 深入理解指针(一)

C语言 -- 深入理解指针&#xff08;一&#xff09; 1.内存和地址1.1 内存1.2 究竟该如何理解编址 2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;​2.2 指针变量和解引用操作符&#xff08;*&#xff09;​​2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引…

C++11 shared_ptr---面试常考

shared_ptr简介 共享对其所指堆内存空间的所有权&#xff0c;当最后⼀个指涉到该对象的shared_ptr不再指向他时&#xff0c;shared_ptr会⾃动析构所指对象如何判断⾃⼰是否指涉到该资源的最后⼀个&#xff1f;《引⽤计数》 shared_ptr构造函数&#xff0c;使引⽤计数析构函数&…

Java线上接口耗时分析神器 Arthas

介绍 程序员的日常&#xff0c;总是离不开“调优”和“排查”。尤其当线上环境出现问题&#xff0c;性能瓶颈把人逼疯。这时候&#xff0c;你就需要一款像 Arthas 这样的神器来救场。 什么是 Arthas&#xff1f; 简单来说&#xff0c;Arthas 是阿里巴巴开源的 Java 诊断工具…