Spring boot项目(问答网站)之timeline的推拉两种模式

Timeline介绍

所谓timeline就是当用户打开主页看到的随着时间轴发生的一系列时间的整合,主要包含:

  • 关注用户的最新动态
  • 热门推荐
  • 广告推荐整合等等.

推、拉模式

  1. 推模式: 当一个用户关注了或者评论了一个问题或用户,触发事件,将会将这一动态广播给该用户所有的粉丝
  2. 拉模式: 用户由于某种行为触发事件后,不会广播给每一个粉丝,只有当粉丝主动查询该用户最近动态时,才从缓存中读取,组建timeline内容。
  3. 推拉结合:当一个用户的粉丝数目过多时,推模式会对后台造成很大压力,浪费存贮空间,特别有些粉丝很有可能已经很久未登录;同样的,当一个用户关注的人特别多,或者同时有很多用户同时查询同样的动态时,对后台读取数据压力特别大。于是,在大多数大规模网站采用一种推拉结合的模式,即是对活跃的用户采用推模式,对不活跃用户采用拉模式,这样就缓解了后端的压力,同时满足了大多数用户的需求。

Timeline的存储

在项目中采用timeline的新鲜事(最新动态)统一存储的模式,存储在在mysql中feed表中,记录下来用户新鲜事的核心数据(例如,如果用户关注了一个问题,那么数据就会包含:用户id,用户的头像、问题id,问题的title,问题的url等)。
在推模式下,每一个用户都应该有自己的timeline数据表,当他关注的用户产生新鲜事feed时,需要新鲜事的id存放在自己的timeline数据表中。在本项目中,我们在redis中存储新鲜事的id,键与值对应关系为:key(TIMELINE:用户id) , value(新鲜事在feed表中的id)。
另外,在后端timeline应该秩保存新鲜事的核心数据,不应该保存渲染它们的模板(前端的东西),当数据访问新鲜事列表时,从后端查询得到新鲜事核心数据,到达前端时应该针对不同的数据信息调用不同的模板去整合渲染。

整体路线

下图表现了整合timeline实现路线,从事件触发到事件处理,然后到timeline存储,以及调用不同模板去渲染整合:
在这里插入图片描述

实现代码

采用经典的三层结构,即model、service以及controller。

  • 首先,是model层,新建java普通对象Feed,并构造对应的setter以及getter,同样的在mysql中创建Feed表,包含与Feed类一致的字段,使用mybatis将数据库与Feed关联。需要注意的是,为了方便保存新鲜事的核心数据,我们将核心数据保存成json串的形式,但是这样在前端读取json会很不方便,因此在本项目中创建一个JSONObject对象,当创建data时,同时也会将json对象化,然后在创建一个get方法,通过key就可以获得保存在json串中对应的核心数据,方便了前端模板读取数据。
public class Feed {
    private int id;
    private int type;
    private int userId;
    private Date createdDate;
    private String data;   //利用JSON串存储的
    private JSONObject dataJSON = null;   // 直接保存一个json对象,便于直接通过key获取在json串中对应的va
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值