浅谈APP流式分页服务端设计

作者: 8a0b9df8a2dd | 来源:发表于2016-05-23 18:42 被阅读5310次

1、传统Web式分页

web开发中常用的分页方式,根据页码进行分页。暂且称为Web式分页

传统Web式分页

根据页码pageIndex和分页大小pageSize进行分页。

-- offset = (pageIndex-1)*pageSize
select * from table limit offset,pageSize;

这种分页方式,在web中使用没有什么太大问题,但是在App分页中能否套用这种分页方式呢?

2、App上拉加载的流式分页

App流式分页

App上的分页方式从表现上看,基本都是上拉加载更多形式的流式分页。如果后台接口仍然按照Web式分页方式进行设计,会有如下问题:
a、数据重复

数据重复

b、数据缺失

数据缺失

c、offset过大时查询效率低
MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降。
由此可见,传统Web式分页接口并不适合App分页。

3、App流式分页服务端设计

a、cursor游标式分页

select * from table where id >cursor limit pageSize

优点:
1)、能够避免数据重复/遗漏
2)、limit性能不会cursor数值大小影响,性能稳定
缺点:
1)、适用于只是按照时间追加的方式的简单排序

b、按照时间分片缓存
非全量数据,只是部分热门数据,因为数据变化太快,可以基于时间段生成多个缓存。对于数据可以按时间段(5分钟)生成一个缓存分片。
具体流程如下:

按时间分片式缓存流程

此处的timestamp值,请求第1页数据时,timestamp传0,服务端检查timestamp<=0,就将当前系统时间赋值给timestamp返回,请求第2,3,...n页数据时,将系统返回的timestamp传入。
缓存的key是根据timestamp进行计算的,比如5分钟一个分片,key=list_201605231700。

if(timestamp>0){
  // 返回timestamp原值
}else{
  // timestamp=系统时间
}
分片缓存请求处理过程

应用场景

比如简书首页热门,只是一些热门文章,排序有一定的复杂性,且相对容易变动。

简书首页热门

目前简书专题中列表排序是按照点赞数排序的,分页请求

http://www.jianshu.com/collections/47/notes?order_by=likes_count&page=48
简书专题页列表分页传参

出现了重复的数据,是因为该排序是实时数据,且没有游标,无法感知前面加载的数据。

c、id列表一次性下发给App

1、请求第一页数据之前先缓存所有id列表
2、请求每页数据时,只需带入相关的id列表参数

这种方式适用于id列表不会很大(数百条数据)的业务场景,例如腾讯新闻。

相关文章

  • 浅谈APP流式分页服务端设计

    1、传统Web式分页 web开发中常用的分页方式,根据页码进行分页。暂且称为Web式分页 根据页码pageInde...

  • APP分页服务端设计

    1、传统Web式分页 web开发中常用的分页方式,根据页码进行分页。暂且称为Web式分页 根据页码pageInde...

  • 2020-07-02

    浅谈 浅谈模块设计宏内核 浅谈接口设计Flags 浅谈稳定性设计重试 浅谈人员业务结构设计矩阵式 浅谈接口设计 |...

  • 浅谈 GPU 及 “App渲染流程”

    浅谈 GPU 及 “App渲染流程”浅谈 GPU 及 “App渲染流程”

  • 浅谈App导航设计

    最近在看一些产品文章时,总会看到一些词汇(例如:“tabbar”、“抽屉菜单”、“宫格菜单”),开始也不是很能理解...

  • iView的表格Table(1)

    服务端分页及自定义序号 应用场景,数据量十分庞大,不适合一次性返回给前端 示例代码 服务端分页并排序、过滤 这里的...

  • 浅谈iOS区块链项目的架构设计

    浅谈iOS区块链项目的架构设计 浅谈iOS区块链项目的架构设计

  • Spring Boot简明教程--Jpa分页

    分页参数 现在的分页形式有两种: PC端分页,参数为:页码 page和每页的条数 size 小程序、app端分页,...

  • 关于电子书中换页的技巧

    概况 目前epub的阅读器是以分页形式显示正文的,epub本身是个流式文本(reflowable),根据设备宽度和...

  • 分页的封装

    分页的封装设计

网友评论

  • EasyCode_1f07:万一用多个字段条件排序呢
  • 流星雨1990:我之前做app接口也是用的游标分页,那种数据变化较快的不需要复杂排序的比较适合用这样的方式..感觉也没啥问题啊
    8a0b9df8a2dd:是的,根据不同的场景选择不同的分页方式
  • f64efb7c2314:a/b/c 三种都不OK
  • 1f2eb51d7992:作者您好,b方式不太理解。您能留个联系方式,给个机会与您交流下吗?
  • 498c438cab9f:其实感觉这几种都不是特别好,所以想问问有没有更好的解决思路。
  • zhuhf:游标分页不是很懂,能解释下吗
    zhuhf:@江湖一键飘 是不是可以理解为一个“参考值”,比如按时间倒叙排序,就是最后一条记录的时间?
    8a0b9df8a2dd:@zhuhf 分页大小limit和上一页最后一个数据的cursor
    zhuhf:@zhuhf 需要app传递的只有分页大小?
  • jimkls:之前也是简单的按照page进行分页,现在流量上来了,数据变化导致数据分页的时候经常出现重复数据,这篇文章提供了很好的思路,赞 :+1:
    流星雨1990:按page分页不仅会重复还可能丢失..
    8a0b9df8a2dd:@jimkls 有好的思路可以一起交流啊
  • 兔兔吉:不明觉厉
    8a0b9df8a2dd:@兔兔吉:cow:

本文标题:浅谈APP流式分页服务端设计

本文链接:https://www.haomeiwen.com/subject/tbgarttx.html