开发过程中经常会有类似朋友圈、动态或空间相关功能。对于类朋友圈动态有几类特征:
- 无需展示页码
- 无需展示总条数
- 排序总是随时间倒序
- 动态可以创建和删除,但一般不可编辑
- 新好友加入,所有动态依然按时间倒排
一般简单展示方案是分页查询,由客户端传递参数页数和页码,后台通过参数进行分页查询。
不过这个方案弊端过于明显:
动态如其名,是动态的。我们认为增加是经常的,删除是少数的,这些操作会影响动态刷新过程中的分页效果。
优化方案:
这里优化方案都才用了一个哨兵字段,可以是时间或id(如果id大小关系与时间前后关系对应),这里用id来表示
方案一
1. 在获取第一页时,记录第一个元素的id字段。后续分页带上哨兵id(maxId),每次翻页页码增一。后台查询增加 id < #{maxId}判断
2. 在获刷新新动态时不带哨兵参数,同时页码置为1,此时丢弃旧数据,重置哨兵id,向后翻页重新累加页码。
解决问题: 此方案解决了新增动态的问题,不会因为新增动态导致获取下一页动态时,获取到已经获取过的老数据。
不足点:
1. 此方案未解决上述操作4、5引起的问题。
操作4会导致后面的动态前移,翻页时紧接删除内容后面的数据将被跳过
操作5会导致已有数据后移,翻页时可能拉到重复数据
因此在不支持删除和新增朋友,或者此类场景极少出现时,可以考虑使用此方案
2. 刷新新数据时会丢弃老数据
方案二
1. 不使用页码功能,每次拉取一页数据后重置哨兵id,获取下一页时带上新的哨兵id(maxId),后台查询增加 id < #{maxId}判断,不做分页,只限制查询条数。
2. 在获刷新新动态时不带哨兵参数,同时页码置为1,此时丢弃旧数据,重置哨兵id,向后翻页重新累加页码。
解决问题: 此方案解决了操作4和5对其他动态的影响问题。删除动态与新增好友导致的动态变化都不会影响已有数据的展示
。
不足点:
1. 已经展示出来的操作4和操作5本身涉及到的动态未能及时刷新,依赖用户刷新最新数据
2. 刷新新数据时会丢弃老数据
总结
一般来说,使用方案二已经有较好的展示效果了,如果还需进一步优化。可以考虑一些额外方案,逻辑会相对复杂,效果有限,且需额外考虑与已有逻辑是否冲突:
1.旧数据丢弃问题:刷新新数据时,设置maxId为反向哨兵id(minId),当拉取最新数据时,带上反向哨兵id,后台查询增加 id > #{minId} 判断,旧数据不清除。
网友评论