关于web分页展示功能的设计
分页展示功能是web中最常见的功能之一
传统的api设计方法是把所有数据排序,并按pageSize分成若干段,根据传入参数page取对应的分段的数据
乍一看,这个设计很传统,也很自然,没毛病
但是仔细研究后,发现这种设计无论从性能还是人性化方面,都有毛病
我们来考虑一个常用场景,新数据在不断加入,如分页展示一个论坛主题数据
数据按时间戳排序,肯定是希望最新的数据在第一页展示,即新数据在列表头部不断加入
按照传统设计,当数据集发生变化,则重新刷新页面,所有页面的数据都会发生变化,这就像从vector头部不断插入数据,所有旧数据都需要往右移动一个单元格一样
这样设计api带来两部分问题:
- 由于所有页面数据不停在变,想要通过缓存页面数据的方式来加速数据响应时间是不可能实现的
- 设计爬虫程序,永远没法一次遍历所有page实现抓取完整数据集的需求
基于以上不足,需要设计一种更科学的分页方法
将数据排序后,从后往前排满所有页面,第一页直接取前pageSize条数据
由于第一页实际分到的数据条数在[1,pageSize]范围内,所以直接取前pageSize条,会造成第一页与第二页可能有[0,pageSize-1]条重复数据
由于重复数据是已知的,从页面展示上把第一页重复数据分开来是很容易的
那么从用户体验上,除了默认打开的第一页会有部分重复数据,任何时候打开其他页面,不管如何刷新,该页数据都是固定不变的(新增页面页面号变化先忽略)
这样带来的好处是
- 新数据的加入,只会影响第一页展示的数据发生变化
- 任何时候,只要从最后一页往前请求api,就一定能正确获取到完整的数据集

浙公网安备 33010602011771号