黑马点评项目实战(八)——Feed流

Feed流

关注推送也叫Feed流,通过无限下拉刷新获取新的信息。

常见两种模式:

image-20250219145254241

Feed流的实现方案

拉模式(读扩散)

消息先发布到发件箱,收件箱一开始为空,关注者每次读取时拉取所有消息,然后按时间戳排序。

优点:节省内存空间,收件箱读取完后可以清空

缺点:每次读取需要重新拉消息并排序,耗时较久。

image-20250219145345786

推模式(写扩散)

消息直接发送到每个关注者的收件箱,可以直接读取。

优点:不需要临时拉取,延迟低。

缺点:内存占用高,每个消息要写多份。

image-20250219145658817

推拉结合模式(读写混合)

对于大V,采用拉模式,消息先发件箱,等待拉取。对于普通人,采用推模式,消息直接推到关注者的收件箱中。

对于活跃粉丝,采用推模式,所有人的消息(包括大V)都会直接发到其收件箱中。而对于普通粉丝,只有读取时才会去拉取消息。

image-20250219150034653

拉模式 推模式 推拉结合
写比例
读比例
用户读取延迟
实现难度 复杂 简单 很复杂
使用场景 很少使用 用户量少,没有大V 过千万的用户量,有大V

Feed流的分页问题

Feed流中的数据会不断更新,所以数据的角标也在变化,因此不能采用传统的分页模式。

image-20250219150931282

Feed流的滚动分页

image-20250219151027061

为了实现滚动分页效果,使用redis中的sorted set数据结构来存储消息和时间戳。

使用命令 ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count

max:当前时间戳 | 上一次查询的最小时间戳

min:0

offset:0 | 上一次查询中,与最小值一样的元素个数

count:3