场景:

前端加载更多,列表数据会重复,但又不是必现。刷新后数据又正常了

经过测试,发现是加载更多时,有新纪录插入数据库,导致返回给前端一条上一页数据。

需求:

用户端可以发表一条记录,列表是根据发表时间倒序

过程分析:

倒序获取20条数据sql写法。pageSize=20,总条数22条,那就会返回第3到22这20条数据

1
order by id desc limit [pageSize] offset [pageSize*(page-1)]

这时候再插入一条数据,总条数变成23条,前端请求下一页数据。就会返回第1到3条,第3条就是重复数据

1
order by id desc limit 20 offset 20

调整:

前端请求的时候,携带上次返回的最大id,以此限制下一页数据id范围。sql的where中加 id < 上次返回最大id,同时offset也不需要了,因为offset也会限制数据范围

前端在数据总条数比当前已经返回的数据条数大的时候,可以继续加载更多。所以返回给前端的数据总条数也需要调整。sql的where中加 id < 第一页返回的最大id,这个id在加载更多时是不变的,这样新插入的数据就不会影响列表数据,第一次请求的时候,后端可以根据page==1,设置一个最大值,比如math.MaxInt64

适用场景:

这种解决方法适用于倒序且频繁更新数据的列表。参考了微信朋友圈的做法