实现Feed流的三种模式:拉模式、推模式和推拉结合模式
在互联网产品中,Feed流是一种常见的功能,它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式,包括拉模式、推模式和推拉结合模式。在本文中,我们将详细介绍这三种模式,并通过Java代码示例来实现它们。
一、拉模式
拉模式,也叫做读扩散,是一种较为节约空间的模式。在这种模式下,当我们关注的用户发表了新的动态,这些动态会被保存在他们自己的邮箱中。当我们需要读取这些动态时,系统会从我们关注的用户中拉取所有的动态,然后进行排序。

优点:节约空间,因为我们在读取信息时,并没有重复读取,而且读取完成后可以清除我们的收件箱。
缺点:延迟较大,当我们读取数据时才去关注的用户中读取数据,如果我们关注了大量的用户,那么此时就会拉取大量的内容,对服务器压力较大。
以下是一个简单的Java代码实现:
public class PullMode {private Map<String, List<String>> userFeeds = new HashMap<>();public void post(String user, String feed) {if (!userFeeds.containsKey(user)) {userFeeds.put(user, new ArrayList<>());}userFeeds.get(user).add(feed);}public List<String> fetch(String user, List<String> following) {List<String> feeds = new ArrayList<>();for (String followee : following) {if (userFeeds.containsKey(followee)) {feeds.addAll(userFeeds.get(followee));}}Collections.sort(feeds);return feeds;}
}
二、推模式
推模式,也叫做写扩散,是一种时效性较强的模式。在这种模式下,当我们关注的用户发表了新的动态,这些动态会被直接推送到我们的收件箱中,因此我们不需要再去拉取这些动态。

优点:时效性强,不需要临时拉取。
缺点:内存压力大,如果一个用户有很多粉丝,那么他发布的每一条动态都会被复制到每一个粉丝的收件箱中。
以下是一个简单的Java代码实现:
public class PushMode {private Map<String, List<String>> userFeeds = new HashMap<>();public void post(String user, String feed, List<String> followers) {for (String follower : followers) {if (!userFeeds.containsKey(follower)) {userFeeds.put(follower, new ArrayList<>());}userFeeds.get(follower).add(feed);}}public List<String> fetch(String user) {return userFeeds.getOrDefault(user, new ArrayList<>());}
}
三、推拉结合模式
推拉结合模式,也叫做读写混合,是一种折中的方案,兼具推和拉两种模式的优点。在这种模式下,对于普通的用户,我们采用写扩散的方式,直接把数据写入到他的粉丝中去;对于有大量粉丝的用户,我们采用读扩散的方式,当粉丝需要读取动态时,再去拉取这些动态。

以下是一个简单的Java代码实现:
public class HybridMode {private Map<String, List<String>> userFeeds = new HashMap<>();private Map<String, List<String>> userPosts = new HashMap<>();public void post(String user, String feed, List<String> activeFollowers) {if (!userPosts.containsKey(user)) {userPosts.put(user, new ArrayList<>());}userPosts.get(user).add(feed);for (String follower : activeFollowers) {if (!userFeeds.containsKey(follower)) {userFeeds.put(follower, new ArrayList<>());}userFeeds.get(follower).add(feed);}}public List<String> fetch(String user, List<String> following) {List<String> feeds = userFeeds.getOrDefault(user, new ArrayList<>());for (String followee : following) {if (userPosts.containsKey(followee)) {feeds.addAll(userPosts.get(followee));}}Collections.sort(feeds);return feeds;}
}
以上就是关于Feed流的拉模式、推模式和推拉结合模式的介绍和Java代码实现,希望对大家有所帮助。
相关文章:
实现Feed流的三种模式:拉模式、推模式和推拉结合模式
在互联网产品中,Feed流是一种常见的功能,它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式,包括拉模式、推模式和推拉结合模式。在本文中,我们将详细介绍这三种模式,并通过Java代码示例来实现…...
Vue中使用Typescript及Typescript基础
准备工作 新建一个基于ts的vue项目 通过官方脚手架构建安装 # 1. 如果没有安装 Vue CLI 就先安装 npm install --global vue/cli最新的Vue CLI工具允许开发者 使用 TypeScript 集成环境 创建新项目。 只需运行vue create my-app 然后选择选项,箭头键选择 Manuall…...
MySQL数据库 【索引事务】
目录 一、概念 二、索引的优缺点 1、索引的优点 2、索引的缺陷 三、索引的使用 1、查看索引 2、创建索引 3、删除索引 四、索引底层的数据结构 1、B树 2、B树 五、索引事务 1、概念和回滚 2、事务的使用 3、事务的基本特性 4、并发会遇到的问题 (…...
源码阅读:classnames
源码阅读:classnames 源码阅读:classnames简介源码解读indexdedupebind类型声明 学习与收获 源码阅读:classnames 简介 classnames 一个简单的 JavaScript 实用程序,用于有条件地将类名连接在一起。 可以通过 npm 包管理器从 n…...
【解惑笔记】树莓派+OpenCV+YOLOv5目标检测(Pytorch框架)
【学习资料】 子豪兄的零基础树莓派教程https://github.com/TommyZihao/ZihaoTutorialOfRaspberryPi/blob/master/%E7%AC%AC2%E8%AE%B2%EF%BC%9A%E6%A0%91%E8%8E%93%E6%B4%BE%E6%96%B0%E6%89%8B%E6%97%A0%E7%97%9B%E5%BC%80%E6%9C%BA%E6%8C%87%E5%8D%97.md#%E7%83%A7%E5%BD%95…...
PostgreSQL中如何配置Huge page的数量
在了解如在PG中如何配置大页之前,我们先要对大页进行一定的了解,为什么要配置大页,配置大页的好处有哪些。 我们日常的操作系统中,程序不直接使用内存,而是使用虚拟内存地址来处理内存分配,避免计算的复杂…...
Mysql之binlog日志浅析
一、binlog日志简介 Binlog是MySQL数据库中的二进制日志,用于记录数据库中所有修改操作,包括增删改等操作。binlog以二进制格式保存,可以通过解析binlog文件来查看数据库的操作历史记录。binlog日志可以用于数据恢复、数据备份、数据同步等场…...
js 生成器函数
生成器函数(Generator Function):生成器函数是一种特殊的函数,可以通过yield关键字来暂停和恢复函数的执行,从而实现惰性计算和迭代器的功能。在例子中,我们定义了一个fibonacci生成器函数,它使…...
HCIP OSPF+BGP综合实验
题目 1、该拓扑为公司网络,其中包括公司总部、公司分部以及公司骨干网,不包含运营商公网部分。 2、设备名称均使用拓扑上名称改名,并且区分大小写。 3、整张拓扑均使用私网地址进行配置。 4、整张网络中,运行OSPF协议或者BGP协议…...
牛客网Verilog刷题——VL46
牛客网Verilog刷题——VL46 题目解析答案 题目 根据题目提供的双口RAM代码和接口描述,实现同步FIFO,要求FIFO位宽和深度参数化可配置。电路的接口如下图所示。 双口RAM端口说明: 同步FIFO端口说明: 双口RAM代码如下ÿ…...
C/C++开源库推荐
C/C开源库推荐 主要都是平常用到的,包含windows开发、android开发、后台开发、音视频开发、深度学习等等最后还附带几个其他语言开发的比较好的项目 GUI开发 qt 跨平台开发库,内部封装了各种跨平台工具,但是大多数情况下都被用作开发跨平台…...
git常用命令速查表
1.git add -u [<路径>]: 把<路径>中所有跟踪(tracked)文件中被修改过或已删除文件的信息添加到索引库。它不会处理未跟踪(untracked)的文件。省略<路径>表示:即当前目录。 2.git add -a [<路径&…...
让两个文件夹里的图片名字一模一样
为了做测试集,对应数据和真值 import os import datetimeimage_names os.listdir(r\Images) #print(image_names) #print(len(image_names))mask_names os.listdir(rG:\Mask) #print(mask_names) #print(len(mask_names))#根据你提供的文件名排序结果来看,问题可…...
会议OA系统会议管理模块开发思路(layui搭建)
目录 一.为什么要进行开发 1.开发目的 2.项目流程 A.发起会议请求过程 1.首先实现我们的多选下拉框功能! 2.时间组件功能,并且提交我们新增加的会议内容 3.在进行发起会议编码时遇到的问题,BUG 3.1.有点时候js访问不到路径 3.2在增加…...
rsync 远程同步
目录 一、Rsync 简介 二、同步方式 备份的方式 三、常用Rsync命令 四、配置源的两种表达方法 五、配置服务端与客户端的实验 启动 rsync 服务程序 发起端(192.168.158.21) 编辑 六. 发起端(客户端)配置 rsyncinotify c…...
PostgreSQL数据库中,查询时提示表不存在的解决办法
最近遇到一个奇怪的问题,以前从来没有遇到过,在postgres SCHEMA下执行select * from table1语句时,提示表不存在,而实际这个表确是存在的,只不过是在public SCHEMA下。在public SCHEMA下执行这个sql语句是没有问题的。…...
视频传输网安全防护体系
在电脑、手机信息安全保护得到广泛关注和普及的今天,监控摄像头等设备的安全防护仍为大众所忽略,大量视频监控网络的前端设备和数据没有任何保护,完全暴露在互联网中。 前端IP接入设备与后端业务系统处于直连状态,一旦有攻击者或…...
C# Blazor 学习笔记(1):Blazor基础语法,组件化和生命周期
文章目录 前言基础语法路由Page 页面元素条件生成if / elseforforeach 绑定参数绑定(赋值,单向)参数绑定(双向)事件绑定字典绑定 attributes 组件化如何使用Parameter 参数注入使用回调函数组件声明回调组件注入回调组…...
flutter 导出iOS问题2
问题1:The Swift pod FirebaseCoreInternal depends upon GoogleUtilities, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries) 参考 正如上图报错第三方…...
syn报文什么时候会被丢弃?
开启tcp_tw_recycle且在NAT下 tcp_tw_recycle重复利用time_wait sockets,会记录最近的连接时间戳,并丢弃远程主机(PAWS机制)所有不严格大于该时间戳的报文。这意味着如果主机在nat下,那么该nat下所有设备将会受影响 TCP半连接队列满了 在半…...
别再只会Commit了!用Git Desktop搞定分支合并与冲突解决(附真实开发场景)
别再只会Commit了!用Git Desktop搞定分支合并与冲突解决(附真实开发场景) 当你第一次接触Git时,可能觉得它就是个"保存按钮"——每次改完代码就commit一下。但随着项目规模扩大,特别是多人协作时,…...
AI原生代码库OpenCode:从代码生成到项目级协同的开发新范式
1. 项目概述:一个面向开发者的AI原生代码库最近在GitHub上看到一个挺有意思的项目,叫opencode-ai/opencode。光看名字,你可能会觉得这又是一个“AI写代码”的工具,或者是一个AI模型的代码仓库。但如果你点进去仔细研究一下&#x…...
基于声明式Web自动化框架Hydra的电商数据监控实战
1. 项目概述:一个被低估的自动化利器 如果你经常需要处理一些重复性的、基于Web界面的操作,比如批量下载某个网站的资源、定时填写表单、或者监控网页内容的变化,那么你很可能已经厌倦了手动点击和等待。传统的脚本编写,尤其是涉及…...
[具身智能-766]:机器人在运动过程中需要实时定位,AMCL 每一次都需要全局撒粒子重搜吗?还是一旦定位后,后续的移动过程中,只需要局部匹配?
直白结论完全不需要每次全局撒粒子重搜定位成功稳定后,机器人全程只做局部小范围匹配,只有丢位置、被挪动时,才会重新全局撒粒子搜索。一、分两种状态1. 正常行走(已定位成功)粒子只聚集在机器人真实位置周边很小一片区…...
Step-by-Step知识蒸馏:让小模型学会大模型的推理过程
1. 项目概述:当“小个子”也能学会“大智慧”最近在模型压缩和知识蒸馏的圈子里,一个挺有意思的讨论点又热了起来:我们有没有可能让一个参数规模小得多的模型,通过一种更精细、更“手把手”的教学方式,达到甚至逼近那些…...
构建高质量Awesome清单:开源项目精选与维护实践指南
1. 项目概述:为什么我们需要一个“Awesome”清单?在开源的世界里,信息过载是每个开发者、技术爱好者乃至项目经理都面临的共同挑战。每天,GitHub、GitLab等平台上都会涌现出成千上万个新项目,从精巧的工具库到庞大的系…...
005 DevEco Studio OHPM同步404报错 解决文档
[cs]005 DevEco Studio OHPM同步404报错 解决文档 文档简介 本文解决鸿蒙开发中新建空白项目自动触发ohpm install时报错:ohos/hypium、ohos/hamock包404找不到、拉取依赖失败问题。 核心原则:不修改项目任何自带文件、不删除系统生成依赖、不改动业务代…...
赛车电气系统设计的现代化转型与实践
1. 赛车电气系统设计的现状与挑战当人们谈论赛车技术时,脑海中浮现的往往是碳纤维车身、空气动力学套件或是大马力发动机。但在这光鲜亮丽的表象背后,电气系统才是现代赛车的"神经系统"。有趣的是,这个关键领域的设计方法却呈现出两…...
编写程序统计婚恋交友消费,相处长处度数据,分析理性婚恋模式,减少年轻人恋爱高频无谓消费。
构建一个婚恋交友消费与相处时长统计分析、理性婚恋模式识别的商务智能示例项目,去营销化、中立化,仅用于学习与工程实践参考。一、实际应用场景描述在当代年轻人的婚恋与社交生活中,存在一种普遍现象:- 约会高度依赖“消费型场景…...
别再满世界找Kettle了!手把手教你定位最新官方下载源(附版本选择建议)
开源工具下载困境突围指南:以Kettle为例构建高效溯源方法论 在开源工具的使用过程中,最令人头疼的莫过于某天突然发现熟悉的下载链接失效,官网改版后找不到下载入口,或是搜索引擎返回的结果全是过时的教程。这种情况不仅发生在Ke…...
