黑马点评项目实战(八)——Feed流
Feed流
关注推送也叫Feed流,通过无限下拉刷新获取新的信息。
常见两种模式:
Feed流的实现方案
拉模式(读扩散)
消息先发布到发件箱,收件箱一开始为空,关注者每次读取时拉取所有消息,然后按时间戳排序。
优点:节省内存空间,收件箱读取完后可以清空
缺点:每次读取需要重新拉消息并排序,耗时较久。
推模式(写扩散)
消息直接发送到每个关注者的收件箱,可以直接读取。
优点:不需要临时拉取,延迟低。
缺点:内存占用高,每个消息要写多份。
推拉结合模式(读写混合)
对于大V,采用拉模式,消息先发件箱,等待拉取。对于普通人,采用推模式,消息直接推到关注者的收件箱中。
对于活跃粉丝,采用推模式,所有人的消息(包括大V)都会直接发到其收件箱中。而对于普通粉丝,只有读取时才会去拉取消息。
拉模式 | 推模式 | 推拉结合 | |
---|---|---|---|
写比例 | 低 | 高 | 中 |
读比例 | 高 | 低 | 中 |
用户读取延迟 | 高 | 低 | 低 |
实现难度 | 复杂 | 简单 | 很复杂 |
使用场景 | 很少使用 | 用户量少,没有大V | 过千万的用户量,有大V |
Feed流的分页问题
Feed流中的数据会不断更新,所以数据的角标也在变化,因此不能采用传统的分页模式。
Feed流的滚动分页
为了实现滚动分页效果,使用redis中的sorted set数据结构来存储消息和时间戳。
使用命令 ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count
max:当前时间戳 | 上一次查询的最小时间戳
min:0
offset:0 | 上一次查询中,与最小值一样的元素个数
count:3