列表分页,数据重复,如何解决

目前的技术架构

定时任务定时从server端同步数据保存并更新到本地的sqlite中, client展示的数据只向db中请求, sql按照一定的规则排序.

问题

向db中请求了第一页的数据(pageSize == 10),并展示在界面上, 这个时候定时任务更新的db中的数据, 那此时db中的排序也更改了, 这样就会出现这样一个问题, 原来排在10名A的数据有可能被挤下去到第二页, 原来的第11名B的数据挤进前10, 那这样,页面上就会出现一个重复的数据A,并且会少一条数据B.

各位大佬有没有什么好的解决办法呢

阅读 7k
5 个回答

一次请求多页,客户端缓存进行分页就好了。不过,我觉得如果实时性要求高,这种问题属于可接受现象

时间线。

对于数据变化频率比较高的数据,时间线比传统分页要更适用。微博、twitter都是这样处理的。

p.s.twitter有一篇文章是具体讲时间线怎么规避传统分页的问题的,CSDN有文章翻译了部分内容,可以大概看下:CSDN:后台实时分页

方法1:列表分页,只显示当前页的内容。换页都重新请求,刷新列表内容。
方法2:参考1楼。 不过我觉得,这种方法仍然解决不了问题,因为数据重复可能发生任何页,你只能忍受。

1)如果数据量不大,返回全部,前端分页
2)如果数据量大且ID自增,每次请求传递最大ID,查询范围为小于等于当前最大ID的数据
3)如果数据量大且ID不自增,请求传递当前时间
4)如果查询条件多且数据经常更新,每次请求传递ids,后端过滤重复的ids后返回

后端接口不变,前端维护一个 ids set,存所有的 id。新数据下来一下后,filter,如果已经在 ids中,就扔掉。
这个代价比较小,无非是一次拉10条,过滤后剩7条,解决不会重复的问题。最差的情况下,刷到后面,10条全部被扔,那按照原逻辑,还是会触发下一页。

真正要解决这个问题,类似 git 一样做个变更表,数据修改,新增的时候添加变更,做版本号。取数据的时候先对比版本号,然后对比旧数据是否在变动中,然后分情况
1 已经取到数据只是顺序变更
2 部分数据(已经给用户)更新后排后面
3 部分数据排名变高(还没给用户)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题