列表分页接口有哪些方案,你知道吗?

简介: 列表分页接口有哪些方案,你知道吗?

前言


  • 列表是 App 中很常见的一种内容排列形式,常见的列表样式有卡片流、瀑布流、信息流等,那么这些列表有什么区别呢?在这篇文章里,我将总结常见的列表样式以及接口分页设计相关问题。如果能帮上忙,请务必点赞加关注,这真的对我非常重要。


1. 常见列表样式


1.1 传统 PC 列表


我们先说一种我们很熟悉的 PC 列表样式,列表底部会带有 上一页/ 下一页 / 页码 的页码切换功能,比如淘宝、百度、京东等列表。这类样式最大的特点是浏览的节奏感,在用户浏览一页数据后会有停顿,因此列表底部常常会设置相关推荐、猜你喜欢等功能。


image.png


传统 PC 列表对屏幕尺寸有一定要求,因此在手机端很少见。那么手机端有哪些常见的列表样式呢?从数据是否有尽头,可以分为普通列表和瀑布流列表。


1.2 普通列表


普通列表是相对于瀑布流列表的,普通列表的内容是有限的,只要一直滑总能滑到尽头。从单个数据项的设计样式区分,可以分为纯文字、图文混排、卡片三种:


  • 纯文字: 以文字信息为主导的布局形式,例如手机短信列表;
  • 图文混排: 以文字 + 图文的信息布局形式,能够快速突出重点。除了标准的单列布局方式外,多种布局形式混合使用能够让布局内容更加多化;
  • 卡片: 将卡片颜色与列表背景颜色可以区分,使得视觉上能够轻易感知到卡片矩形的存在。同时,借助了卡片后景深(也就是卡片阴影)将页面 XY 轴扩展到 XYZ 三轴,从而加强了视觉层级丰富性。目前,卡片式设计已经成为 App 中使用非常广告的设计样式。除了标准的单列布局外,双列卡片流也很常见。


1.3 瀑布流列表


相对于简单列表,瀑布流列表指内容像瀑布一样源源不断,一直滑不到尽头的列表。最常见的一种瀑布流是信息流(或 Feed 流),几乎每个产品都存在信息流。信息流在分发内容时,会根据用户的喜好对内容进行干预,更精准地向用户推荐内容。我们熟悉的产品中有哪些是信息流呢?


  • 微信朋友圈:不算信息流,朋友圈是按照最近发布时间排序,且存在尽头;
  • 知乎回答列表:不算信息流,回答列表是按照热度等指标综合排序,且存在尽头;
  • 抖音首页 / 小红书首页:算信息流,根据用户推荐,且滑不到尽头。


即使列表的数据量很小,列表接口也应该在一开始就支持分页增量请求,避免将来再支持时的兼容问题。那么,列表分页有哪些设计方案呢?


2. 基于偏移分页


基于偏移是最常见的分页接口设计,其原理是通过数据库查询语句的 offset + limit 指定某一分页的数据。例如:


# 获取第 curPage 页数据,每页数据量为 pageSize
select * from ... where ... order by ... limit (curPage - 1) * pageSize, pageSize
复制代码


因此,前端参数需要指定请求的页码 page 和可选的每页数据量 size:


第一页请求:
page : 1  // 当前页码,必选
size : 10 // 每页数据量,可选
响应:
list:[{1},{2},{3}...,{10}]   // 列表数据
total:100                    // 数据总量
-----------------------------------
第二页请求:
page : 2  // 当前页码,必选
size : 10 // 每页数据量,可选
响应:
list:[{11},{12},{13}...,{20}]   // 列表数据
total:100                       // 数据总量
复制代码


基于偏移的分页方案优势在于简单易理解,而且能够支持点击 上一页/ 下一页 / 页码 按钮切换分页,实现传统 PC 列表的样式。但劣势也是很明显的,主要分为两个方面:


  • 慢查询: SQL 查询语句在配合 offset、limit 查询时,如果 offset 偏移过大,会造成慢查询;
  • 动态数据: 从前端展示一页数据到增量请求下一页数据之间会有一个时间差,如果这段时间内数据存在更新,则在请求下一页数据时可能会存在重复或缺失。我画了个示意图帮助你理解为什么数据更新会引起重复或缺失:


image.png

数据重复的情况虽然可以通过前端去重的方式避免,但也会导致新一页展现的数据量参差不齐。那么,对于动态数据的场景,应该如何设计分页接口呢?


3. 基于游标分页


基于游标的分页设计适用于动态数据场景,其原理是根据已获取的最后一条数据的 ID 作为参数来请求下一页数据。例如:


# 获取第 curCursor 后的一页数据,每页数据量为 pageSize
select * from ... where ... and id > $curCursor order by id limit ($curPage - 1) * $pageSize, $pageSize
复制代码


因此,前端在请求分页接口时,不再指定下一个页码 page,而是根据已接收的最后一条数据的 ID 来请求下一页数据:


第一页请求:
cursor : 0  // 当前游标,必选
size : 10   // 每页数据量,可选
响应:
list:[{1},{2},{3}...,{10}]   // 列表数据
total:100                    // 数据总量
-----------------------------------
第二页请求:
cursor : 10  // 当前游标,必选
size : 10   // 每页数据量,可选
响应:
list:[{11},{12},{13}...,{20}]   // 列表数据
total:100                       // 数据总量
复制代码


为什么游标的方案可以避免数据重复或缺失呢?这是因为无论数据发生新增还是减少时,基于游标的分页请求都获取该游标后续的一页数据,而基于偏移的分页请求是获取变更后数据排序后指定偏移位置的数据,这些数据在之前的请求中是否重复或缺失是无从得知的。


当然了,基于游标的分页方案也存在局限性:


  • 不可以支持点击 上一页/ 下一页 / 页码 按钮切换分页,App 基本不存在传统 PC 列表的操作,几乎没有影响;
  • 只适合简单排序场景,例如按照时间排序或主键 ID 排序(主键 ID 通常是按照插入时间递增的)


4. 总结


除了上述方案,还有没有其他分页设计呢,在评论区告诉我吧。

目录
相关文章
|
新零售 安全 专有云
【全新发布】OneData数据模型白皮书---新零售行业智慧数据
OneData数据模型白皮书---新零售行业智慧数据
18424 1
【全新发布】OneData数据模型白皮书---新零售行业智慧数据
|
关系型数据库 MySQL Java
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
MySQL的主从复制 && SpringBoot整合Sharding-JDBC解决读写分离
500 0
vscode中使用/deep/报错解决方案
vscode中使用/deep/报错解决方案
904 0
|
消息中间件 弹性计算 前端开发
RabbitMQ入门 -- 阿里云服务器安装RabbitMQ
什么是RabbitMQ,浅谈RabbitMQ!
2294 1
RabbitMQ入门 -- 阿里云服务器安装RabbitMQ
|
缓存 编解码 JavaScript
理解打包好的vue项目结构dist包
理解打包好的vue项目结构dist包
419 3
|
12月前
|
存储 NoSQL 算法
Redis地理散列GeoHash
GeoHash作为一种高效的地理位置编码算法,在Redis中得到了很好的支持。通过使用Redis的GeoHash命令,可以方便地进行地理位置的存储、查询和计算。GeoHash在位置存储、附近位置搜索、距离计算和实时定位等场景中有着广泛的应用。掌握GeoHash及其在Redis中的使用方法,可以极大地提高地理位置相关应用的开发效率和性能。
217 5
|
消息中间件 缓存 前端开发
评论系统如何不崩溃?揭开海量评论背后的技术秘密
小米介绍了一种高效处理海量新闻评论的技术方案。面对突发新闻带来的评论潮,通过采用消息队列异步入库、读写分离以及热点缓存等技术,不仅能有效减轻数据库压力,还能保证用户快速查看最新评论。消息队列如Kafka或RabbitMQ可缓存评论请求,后台异步处理入库,避免数据库过载。读写分离则通过主从数据库架构分散读取负载,配合热点评论的缓存机制进一步提升访问速度。这套架构确保了系统的稳定性和响应速度,适用于高并发的评论处理场景。
270 0
|
机器学习/深度学习 人工智能 NoSQL
【AIGC】深入浅出理解检索增强技术(RAG)
【5月更文挑战第10天】本文介绍了检索增强生成(RAG)技术,这是一种将AI模型与内部数据结合,提升处理和理解能力的方法。通过实时从大型文档库检索信息,扩展预训练语言模型的知识。文章通过示例说明了当模型需要回答未公开来源的内容时,RAG如何通过添加上下文信息来增强模型的回答能力。讨论了实际应用中令牌限制和文本分块的问题,以及使用文本嵌入技术解决相关性匹配的挑战。最后,概述了实现RAG的步骤,并预告后续将分享构建检索增强服务的详情。
861 3
|
JSON 安全 Dubbo
实践指南:WebSocket 鉴权的最佳实践
WebSocket 作为实时通信的利器,越来越受到开发者的青睐。然而,为了确保通信的安全性和合法性,鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制,为你呈现一揽子的解决方案,确保你的 WebSocket 通信得心应手。
实践指南:WebSocket 鉴权的最佳实践
|
Java Maven
Mac安装Maven(图文解说详细版)
Mac安装Maven(图文解说详细版)
Mac安装Maven(图文解说详细版)