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

news2024/11/16 20:55:09

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

文章目录

  • 前言
  • 一、关注推送是什么?是什么是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.coloradmin.cn/o/1900901.html

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

相关文章

7寸微型FPV无人机技术详解

对于7寸微型FPV(First Person View,第一人称视角)无人机技术的详解,可以从以下几个方面进行介绍: 一、定义与基本概念 FPV无人机,全称为“第一人称视角无人机”,它利用安装在无人机上的摄像头…

QT c++函数模板与类模板的使用

QT c类模板的使用 #pragma once#include <QtWidgets/QMainWindow> #include "ui_QtWidgetsApplication5.h"class QtWidgetsApplication5 : public QMainWindow {Q_OBJECTpublic:QtWidgetsApplication5(QWidget *parent nullptr);~QtWidgetsApplication5();te…

HTML5使用<mark>标签:高亮显示文本

1、<mark>标签的使用 mark 标签用于表示页面中需要突出显示或高亮的一段文本&#xff0c;这段文本对于当前用户具有参考作用。它通常在引用原文以引起读者注意时使用。<mark>标签的作用相当于使用一支荧光笔在打印的纸张上标出一些文字。它与强调不同&#xff0c;…

Go语言--复合类型之指针与数组

分类 指针 指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go 语言对指针的支持介于 Java 语言和 C/C语言之间,它既没有想 Java 语言那样取消了代码对指针的直接操作的能力,也避免了 C/C语言中由于对指针的滥用而造成的安全和…

使用Source Insight 4.0

一、使用书签 二、添加文件 三、Search 3.1 替换所有变量 四、右键查询 4.1 查看被调用的地方

ChatGPT对话:Scratch编程中一个单词,如balloon,每个字母行为一致,如何优化编程

【编者按】balloon 7个字母具有相同的行为&#xff0c;根据ChatGPT提供的方法&#xff0c;优化了代码&#xff0c;方便代码维护与复用。初学者可以使用7个字母精灵&#xff0c;复制代码到不同精灵&#xff0c;也能完成这个功能&#xff0c;但不是优化方法&#xff0c;也没有提高…

C++使用Poco库封装一个HTTP客户端类--Query参数

0x00 概述 我们使用Poco库的 Poco::Net::HTMLForm 类可以轻松实现表单数据的提交。 0x01 ApiPost提交表单数据 0x02 HttpClient类 #ifndef HTTPCLIENT_H #define HTTPCLIENT_H#include <string> #include <map> #include <Poco/URI.h> #include <Poco/N…

set的应用(C++)

set的使用 【基本用法】 大家可以敲一下这段代码体会一下set的基本初始化和使用 #include <iostream> #include <set> #include <vector> using namespace std;int main() {set<int> st1; // 空的set// 使用迭代器构造string str("abcdef"…

【机器学习】基于密度的聚类算法:DBSCAN详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 基于密度的聚类算法&#xff1a;DBSCAN详解引言DBSCAN的基本概念点的分类聚类过…

Flower花所:稳定运营的数字货币交易所

Flower花所是一家稳定运营的数字货币交易所&#xff0c;致力于为全球用户提供安全、高效的数字资产交易服务。作为一家长期稳定运营的数字货币交易平台&#xff0c;Flower花所以其可靠的技术基础和优质的客户服务而闻名。 平台稳定性与可靠性&#xff1a; 持续运营&#xff1a;…

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

WordPress子比主题美化文章顶部添加百度收录按钮

要在WordPress子主题中美化文章顶部并添加百度收录按钮&#xff0c;你可以按照以下步骤操作&#xff1a; 首先&#xff0c;确保你的主题支持自定义CSS。如果不支持&#xff0c;你需要在主题目录下创建一个名为style.css的文件&#xff0c;并将以下代码复制到该文件中。如果你的…

Science期刊政策反转:允许生成式AI用于论文写作,意味着什么?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 关于各大top期刊和出版社对于生成式AI用于论文写作中的规定&#xff0c;娜姐之前写过一篇文章&#xff1a; 如何合理使用AI写论文&#xff1f;来看Top 100学术期刊和出版社的…

高算力智能监控方案:基于瑞芯微RK3576核心板开发NVR网络视频录像机

近年来&#xff0c;随着人工智能和物联网技术的不断发展&#xff0c;网络视频录像机&#xff08;NVR&#xff09;在智能监控领域中的应用越来越广泛。本文将围绕RK3576核心板展开讨论&#xff0c;探讨其在NVR开发中的潜力和优势。 一、RK3576核心板 RK3576是瑞芯微的新一代中…

刷题之多数元素(leetcode)

多数元素 哈希表解法&#xff1a; class Solution { public:/*int majorityElement(vector<int>& nums) {//map记录元素出现的次数&#xff0c;遍历map&#xff0c;求出出现次数最多的元素unordered_map<int,int>map;for(int i0;i<nums.size();i){map[nu…

【星海随笔】ssh全解

发现 ssh 把我卡了很久&#xff0c;自己的文档也没有专门写 ssh 的&#xff0c;这一个文档会持续专精更新 ssh 相关的技术文档。 有些企业是全 BMC 管理平台。没有 ssh 密码登录权限 sudo apt-get install openssh-server检查SSH配置文件&#xff08;通常是 /etc/ssh/sshd_conf…

干货 | 2024云安全责任共担模型(免费下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a;

制定事件响应计划的四个关键步骤,如何做到风险闭环

一个有效的安全事件响应策略的关键组成部分有哪些&#xff1f;一个有效的安全事件响应策略包括四个关键组成部分&#xff0c;它们协同工作以确保对网络安全问题的快速和有效响应。 一个有效的安全事件响应策略的关键组成部分有哪些&#xff1f; 一个有效的安全事件响应策略包括…

HTML5使用<details>标签:展开/收缩信息

details 标签提供了一种替代 JavaScript 的方法&#xff0c;它主要是提供了一个展开/收缩区域。details 标签中可以使用 summary 标签从属于 details 标签&#xff0c;单击 summary 标签中的内容文字时&#xff0c;details 标签中的其他所有从属元素将会展开或收缩。语法如下&a…