在客户端不论是web还是app中,现在加载数据流行的做法是将下一页的数据累加在当前页面之下。达到页面触底加载下一页数据的效果。
如果服务端还是按照当年分页的写法返回数据的话,一定会遇到一个问题。
当我们加载一次数据之后,数据库有了新增数据,此时再加载下一批数据的话,会发现上一次的数据和最新加载的数据有重复。
例如数据库当前有11条数据(id:1-11),按照倒序排列,第一次加载到了11-2,一共十条数据。在此时新增了一条数据(id13),向上拖动页面达到底部开始加载一波数据。服务端按照传统分页写法,每页加载10条数据获取第二面的数据,会获得id1、id2,两条数据。这时在客户端会发现两个id2。
解决方案就是需要锁定id。客户端向服务端获取数据的时候,携带id值。
方法1、携带服务端首次返回数据的id最大值。以后所有的数据查询都以此id为分隔。只查询小于此id的所有数据(where id < #{maxId} ),就不会出现上述问题。
方法2、携带当前客户端的最后一条数据的id。每次向服务端获取新数据的时候,服务端数据的查询范围为(where id between #{id-1} and #{id – 10} ,如果每页十条的话)
应该还有别的更优雅的解决方案。这仅为我早上在地铁里胡乱想出的两个办法。