实现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代码实现,希望对大家有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos7 安装man中文版手册

查找man中文安装包&#xff1a; yum search man-pages 安装man-pages-zh-CN.noarch: yum install -y man-pages-zh-CN.noarch

05|Oracle学习(UNIQUE约束)

1. UNIQUE约束介绍 也叫&#xff1a;唯一键约束&#xff0c;用于限定数据表中字段值的唯一性。 1.1 UNIQUE和primary key区别&#xff1a; 主键/联合主键每张表中只有一个。UNIQUE约束可以在一张表中&#xff0c;多个字段中存在。例如&#xff1a;学生的电话、身份证号都是…

091.粉刷房子

一、题目 剑指 Offer II 091. 粉刷房子 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int minCost(vector<vector<int>>& costs) {int row costs.size();int col costs[0].size();if (row 1)return min(min(costs[0][0], cos…

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下&#xff1a; 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例&#xff0c;穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…

Python元编程-装饰器介绍、使用

目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒&#xff0c;打印时间 方法一&#xff1a;使用datetime 方法二&#xff1a;使用time 一、Python元编程…

【Git】git reflog git log

前言 日常开发过程中&#xff0c;我们经常会遇到要进行版本回退的情况&#xff0c;这时候需要使用git reflog和git reset 命令 git reflog 常用命令&#xff1a; 1、git reflog -n 查看多少条 2、git reflog show origin 查看远程历史变动 git log 什么都不加默认显示当前分…

Python实现GA遗传算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…

代码随想录算法训练营之JAVA|第十八天| 235. 二叉搜索树的最近公共祖先

今天是第 天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天&#xff0c;如果做不到&#xff0c;完成一件评论区点赞最高的挑战。 算法挑战链接 235. 二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/descriptio…

springboot自定义错误消息

为了提供自定义错误消息提示&#xff0c;springboot在resources目录下&#xff0c;有一个文件ValidationMessages.properties 用于存储 验证错误的消息提示&#xff1a; 比如&#xff1a; 这样一个ValidationMessage.properties username.notempty用户名不能为空 username.len…

互联网宠物医院系统开发:数字化时代下宠物医疗的革新之路

随着人们对宠物关爱意识的提高&#xff0c;宠物医疗服务的需求也日益增加。传统的宠物医院存在排队等待、预约难、信息不透明等问题&#xff0c;给宠物主人带来了诸多不便。而互联网宠物医院系统的开发&#xff0c;则可以带来许多便利和好处。下面将介绍互联网宠物医院系统开发…

前端生成图片验证码怎么做?

##题记&#xff1a;我们实现一个功能首先想一下我们需要做哪些工作&#xff0c;比如我们需要生成一个随机的图片验证码&#xff0c;我们需要一个就是点击事件获取验证码&#xff0c;通过接口我们去获取图片路径进行渲染就行&#xff0c;这里边还要牵扯一件事情就是获取一个随机…

Git笔记--Ubuntu上传本地项目到github

目录 1--基本配置 2--本地上传 1--基本配置 ① 创建ssh-key cd ~/.sshssh-keygen -t rsa -C "邮箱地址"② 查看并关联ssh-key gedit id_rsa.pub 复制内容&#xff0c;在 GitHub 中依次点击 Settings -> SSH and GPG keys -> New SSH key&#xff0c;将 id…

gateway过滤器没生效,特殊原因

看这边文章的前提&#xff0c;你要会gateway&#xff0c;知道过滤器怎么配置&#xff1f; 直接来看过滤器&#xff0c;局部过滤器 再来看配置 请求路径 http://127.0.0.1:8080/appframework/services/catalog/catalogSpecials.json?pageindex1&pagesize10&pkidd98…

【微服务】springboot整合redis哨兵集群使用详解

目录 一、前言 二、环境准备 三、安装redis 3.1 前置准备 3.1.1 下载安装包 3.1.2 准备依赖环境 3.1.3 上传并解压包 3.2 执行安装 四、搭建redis主从集群 4.1 环境准备 4.2 搭建过程 4.2.1 创建实例文件目录 4.2.2 修改redis.conf配置文件 4.2.3 拷贝配置文件 4…

微信小程序页面传值为对象[Object Object]详解

微信小程序页面传值为对象[Object Object]详解 1、先将传递的对象转化为JSON字符串拼接到url上2、在接受对象页面进行转译3、打印结果 1、先将传递的对象转化为JSON字符串拼接到url上 // info为对象 let stationInfo JSON.stringify(info) uni.navigateTo({url: /pages/statio…

【枚举边+树的直径】CF14D

Problem - 14D - Codeforces 题意&#xff1a; 思路&#xff1a; 两条链不相交&#xff0c;说明是在不同连通分量中&#xff0c;我们可以枚举边来把树分为两个连通分量&#xff0c;然后分别计算直径即可 Code&#xff1a; #include <bits/stdc.h>#define int long lo…

809 服务端程序

809 服务端程序 目录概述需求&#xff1a; 设计思路实现思路分析1.Byte2MessageDecoder2.Tcp client:3.1234.demo 拓展实现 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make …

微服务性能分析工具 Pyroscope 初体验

Go 自带接口性能分析工具 pprof&#xff0c;较为常用的有以下 4 种分析&#xff1a; CPU Profiling: CPU 分析&#xff0c;按照一定的频率采集所监听的应用程序 CPU&#xff08;含寄存器&#xff09;的使用情况&#xff0c;可确定应用程序在主动消耗 CPU 周期时花费时间的位置…

Vue2 第十二节 Vue组件化编程 (二)

1. VueComponent 2. 单文件组件 一. VueComponent 组件本质上是一个名为VueComponent的构造函数&#xff0c;不是程序员定义的&#xff0c;是Vue.extend生成的只需要写<school/>或者<school><school/>&#xff0c;Vue解析时&#xff0c;会帮我们创建schoo…

[golang gin框架] 44.Gin商城项目-微服务实战之后台Rbac微服务之权限的增删改查微服务

上一节讲解了[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联,这里讲解权限管理Rbac微服务权限的增删改查微服务 一.实现后台权限管理Rbac之权限增删改查微服务服务端功能 1.创建Access模型 要实现权限的增删改查,就需要…