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
},
{
"behot_time":1494380598
},
{
"behot_time":