Java分页服务端数据去重的解决方案

1. 问题描述

将分页、降序数据用瀑布流展示的时候,因为数据总量是不断变化的,导致之前第一页的数据可能变成第二页,第三页,这样客户查看的时候可能出现重复数据展示。(最新的数据会插到列表的最前端)。 典型的是活动参与人列表页,因为这部分数据对于业务方来说可能非常重要,不能出现任何的重复或者顺序显示的不对。

2. 实际场景

用户按照分页降序请求瀑布流数据的时候,请求完第一页,在该页停留了 5 分钟,这段时间内数据库中可能已经插入了多条新数据,再次请求第二页的时候就有可能出现一些重复数据,对于客户体验很不好,而且很可能引发客户的投诉。

效果图:
P1 在第一屏的时候在第一页,如果客户在一分钟内没有做任何操作,下一分钟下滑页面的时候去DB中获取第二页的时候会拿到重复的数据。
这里写图片描述 这里写图片描述

3. 解决方案

(1)添加缓存

让动态数据变成静态数据,但不能从根本上解决数据重复问题,只能在一个时间段内保证不出现重复数据,缓存失效后仍然可能出现重复数据。

(2)增加序列号(唯一有序),

记录上一页请求结果的最后一条记录,请求下一页的时候加上这条记录用于后端判断,后端只取该记录之后的数据,强行将动态数看做静态数据处理。
这里写图片描述 这里写图片描述

/**
 * P1 的最后一条记录序列号是 11, 查询第二页的时候加上这个条件,只取 id 小于 11 的数据,可* 以取到正确数据
 */
List<User> getUsers(size, serialNo){
    List<User> users = selectFromESOrDBWhereIdIsLower(size, serialNo);
    return users
}
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这种方案的关键在于一个唯一有序的序列号,根据这个序列号可以进行条件查询,可以锁定一个固定的范围。

目前这种方案也是今日头条采用的方案:
这里写图片描述

这里写图片描述

简化版头条分页数据出参 JSON:

{
    "return_count":15,
    "data":[
        {
            "behot_time":1494381138
        },
        {
            "behot_time":1494380958
        },
        {
            "behot_time":1494380778
        },
        {
            "<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值