分页重复问题思考

简介: 目前项目中存在一个问题,列表会出现数据重复!原因很容易想到,由于排序原因新添加数据会排在顶部。勤劳的我们又要开始摸头了 :-)

目前我们常用的分页基本都是前端传输两个关键字段(条数、页数),基于此的分页针对静态数据是没有问题的,数据的顺序和总量都是不变的。

列表分页会碰到的几个数据变更情况

  • 总量不变,排序顺序改变
  • 总量改变,排序顺序不变
  • 总量改变,排序顺序改变

总量不变,排序顺序改变

业务举例:排行榜
假设有一个排行榜数据为 ‘ A B C D E,F G H I’
如果加载第一页后后端数据有变动,当加载第二页时整体数据变为了 ‘A B C F E,G D H I’ 加载第二页数据变为了 ‘G D H I’,这是后展示到列表会发现 G 重复出现了两次并且 F 丢失了没有加载出来。

针对这种情况有以下几种解决办法:

  • 数据量不是特别大的情况下,每次都全量加载数据,避免分页。
  • 创建快照数据,每十分钟生成一次快照数据,前端增加首次加载第一页时的时间戳字段,后端返回基于首次访问时间戳的快照数据,虽然牺牲一部分实时性但是数据可以保证无误。
  • 通过变动记录获取旧数据,这个方法和快照有点类似,我们依然可以拿前端加载第一页时的时间戳根据时间查询在此时间之前的数据,通过变更记录表查询我们也会牺牲一部分实时性,适用在一些数据量、用户量不大的情况。

总量改变,排序顺序不变

业务举例:要求 时间顺序倒排 的各种列表数据
这个也是我们目前碰到的问题,排序不变数据不停的在增加,并且要求最新数据在顶部
我们拿id倒序举例,加载第一页 ‘5,4,3,2,1’,此时数据有新增,用户获取第二页 ‘1’,此时id为 1 的数据出现了两次。

针对这种情况有如下解决办法:

  • 每次加载下一页时要求前端携带上一页数据的 最后一条数据的id,这样的话后端查询时可以条件判断跳过这个id之前或之后的数据。但是这样查询并不是任何时候都能支持,如果查询里面有根据id以外的数据进行排序,使用id过滤将导致数据错误。
  • 根据业务需求由前端传输上一页列表头部或尾部的数据id,后端根据业务在准备返回的列表中清除这个id之前或之后的数据避免前端展示重复。此方法会导致返回前端列表数量不确定,算一个折中的处理方法。

总量改变,排序顺序改变

业务举例:商品列表按销量排序
商品在动态增加,同时销量也在更新,如果想拿到最新数据只能从第一页重新加载。

  • 参照 ‘总量不变,排序顺序改变’ 处理方法,创建记录变更表,使用用户加载第一页时的时间戳进行比较查询,确保用户看到某一时数据是固定的。方法不足之处是需要记录变更信息,如果查询量大效果也不尽人意。

以上思考均是业务中碰到后做的一些思考,建议结合实际业务和产品进行沟通选择合适的方案。

目录
相关文章
|
前端开发 Java 关系型数据库
基于javaweb旅游景点线路预定系统设计与实现
基于javaweb旅游景点线路预定系统设计与实现
269 0
使用ffmpeg工具下载m3u8类型的视频到本地
使用ffmpeg工具下载m3u8类型的视频到本地
1549 0
使用ffmpeg工具下载m3u8类型的视频到本地
|
SQL 数据可视化 关系型数据库
【MySql】MySQL排序分页查询数据顺序错乱的原因和解决办法
【MySql】MySQL排序分页查询数据顺序错乱的原因和解决办法
1161 0
|
Arthas 监控 应用服务中间件
HSF Serialize response error on provider side
项目组的应用在HSF Consumer调用HSF Provider时遇到异常。问题源于HSF Provider端序列化响应数据时发生的错误,具体为`com.taobao.hsf.com.caucho.hessian.io.ContextSerializerFactory.getCustomSerializer`方法中的`Class.forName`调用抛出了`NullPointerException`。通过Arthas工具的`watch`命令监控并分析异常堆栈,发现异常发生在尝试获取自定义序列化器的过程中。
769 1
|
消息中间件 缓存 前端开发
评论系统如何不崩溃?揭开海量评论背后的技术秘密
小米介绍了一种高效处理海量新闻评论的技术方案。面对突发新闻带来的评论潮,通过采用消息队列异步入库、读写分离以及热点缓存等技术,不仅能有效减轻数据库压力,还能保证用户快速查看最新评论。消息队列如Kafka或RabbitMQ可缓存评论请求,后台异步处理入库,避免数据库过载。读写分离则通过主从数据库架构分散读取负载,配合热点评论的缓存机制进一步提升访问速度。这套架构确保了系统的稳定性和响应速度,适用于高并发的评论处理场景。
270 0
|
消息中间件 关系型数据库 MySQL
如何保证消息幂等
如何保证消息幂等
|
存储 SQL 缓存
分页列表缓存,你真的会吗
开源中国的红薯哥写了很多关于缓存的文章,其中多级缓存思路,分页列表缓存这些知识点给了我很大的启发性。 写这篇文章,我们聊聊分页列表缓存,希望能帮助大家提升缓存技术认知。
分页列表缓存,你真的会吗
|
MySQL 关系型数据库 内存技术
MySQL · 新特性分析 · CTE执行过程与实现原理
众所周知,Common table expression(CTE)是在大多数的关系型数据库里都存在的特性,包括ORACLE, SQLSERVER,POSTGRESQL等,唯独开源数据库老大MySQL缺失。CTE作为一个方便用户使用的功能,原本是可以利用普通的SQL语句替代的,但是对于复杂的CTE来说,要模拟出CTE的效果还是需要很大的功夫。如果考虑性能那就更是难上加难了。2013年Guilhem
4431 1
|
存储 Serverless 索引
408数据结构学习笔记——B树、B+树、散列表
408数据结构学习笔记——B树、B+树、散列表
499 1
408数据结构学习笔记——B树、B+树、散列表
|
JSON Java Apache