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

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列表不会很大(数百条数据)的业务场景,例如腾讯新闻。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,168评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,130评论 25 709
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,846评论 1 92
  • 大概我永远都是极度无味,各种克制 就算心里不是这样,表达的表现的却永远都是极度无味,各种克制
    Damon_Dai阅读 284评论 0 0
  • 1、日K线是根据币价(指数)一天的走势中形成的四个价位即:开盘价,收盘价,最高价,最低价绘制而成的。 收盘价高于开...
    链闻阅读 881评论 0 4