滚动(下滑)翻页 数据重复问题 解决方案

April 14th 2020 | 技术

公司业务发展迅速,用户量急剧上升中,偶尔会发现这么一个问题,就是下一页的数据中总会出现上一页的几条数据。

具体表现就是
在这里插入图片描述
image.png
注意4号和5号 第一页和第二页都出现的了这两人 为什么会造成这个问题呢?用户在查询第一页的时候,停留了一下,然后在这段时间内 又有两个用户注册了,然后请求第二页的数据的时候 排序的时候 两个新用户排在了最前面(按照注册时间排序) 所以导致4号和5号在第二次排序的时候就变成了第二页的数据 又返回了。

那如何解决这个问题呢?

解决方案1 (缺点 在出现重复数据时排序会异常 所以只支持唯一值整数字段做这种排序)在每次请求的时候都带上前台最后一条数据的注册时间,然后查询的时候添加一个条件:注册时间小于该时间,这样每次返回的都只需要返回第一页的数据就可以了 。上拉刷新的时候带上当前时间即可(第一页获取总条数)
解决方案2 (缺点 性能较差 不支持动态更新的字段 比如点击数 优点 在没有新数据和老数据重复的排序值时 可以保证不会出现重复数据) 前端缓存第一页的第一条数据排序字段值(比如id)请求携带这个字段值 每次查询 加个条件 根据排序方向比较一下这个字段(倒序就是<=这个id 正序就是>=) 这样分页的数据就会保持一致
解决方案3 (缺点 内存消费较大 优点 速度快 保证不会出现翻页重复问题)缓存分页全部数据 根据条件 作为缓存key 第一页删除旧缓存创建缓存 其他页读取缓存 无过期时间

额外说一下 想支持跳转指定页可以考虑页码分组
实现步骤

对页码进行分组(groupSize=8, pageSize=20),每组为8个页码;

提前查询 end_offset,同时获得本组页码数量 即可实现