V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mscststs
V2EX  ›  编程

列表分页,怎么保证第二页不出现第一页的某些条目

  •  
  •   mscststs · 2019-04-06 12:41:30 +08:00 · 4712 次点击
    这是一个创建于 2057 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近忽然又想到了这个问题。

    很多网站都会用 列表+分页 的方式来展现信息,手机端也有下拉加载(分页的另一种表现形态),但是分页的同时又会出现一个问题:第一页的某些条目,在第二页又出现了。 原因是点下一页之前有几条数据被新的数据顶到了第二页。

    想问问看有没有什么好的方法可以解决这种问题,不论是前端还是后端。

    13 条回复    2019-06-21 08:12:51 +08:00
    yangg
        1
    yangg  
       2019-04-06 12:43:41 +08:00 via iPhone
    拿最后一条的 ID 或者时间去不就好了
    PHPJit
        2
    PHPJit  
       2019-04-06 12:43:56 +08:00 via Android
    前端过滤去重
    mscststs
        3
    mscststs  
    OP
       2019-04-06 12:51:08 +08:00
    @yangg 用 ID 确实可以,但是有些列表是这样的:比如论坛、贴吧贴子,是根据最后回复时间来排序的


    @PHPJit 前端过滤的话会不会出现每个页面的 PageSize 不固定?我感觉前端过滤的话可能也有一定的问题
    woodnaonly
        4
    woodnaonly  
       2019-04-06 13:12:03 +08:00 via Android
    @PHPJit 后端太菜丢给前端不可取
    iConsLii
        5
    iConsLii  
       2019-04-06 13:14:51 +08:00 via Android
    可以在第一页跳到第二页的时候,记录个最新的 ID 或者时间点,在后面几页都带上
    ffeii
        7
    ffeii  
       2019-04-06 13:26:23 +08:00   ❤️ 1
    排序会实时变动的列表不适合分页
    kltt22
        8
    kltt22  
       2019-04-06 13:35:29 +08:00 via Android
    起始 ID +数量
    Vegetable
        9
    Vegetable  
       2019-04-06 13:55:58 +08:00
    说用 id 的是搞笑呢?你这个起始 id 被顶到第一位怎么办?

    这不是一个技术问题,而是设计问题.不用去纠结这个.就算是要纠结也是产品经理该纠结的事情.

    看第一页的时候,第二页的某个帖子有人回复,那么我翻到第二页就看不到这个帖子了,同时看到了第一页的最后一个帖子.
    极端情况下会出现翻到第二页发现和第一页的内容完全相同.
    这是无法用技术解决的.只能从设计上就降低这个问题带来的影响,并且需要考虑的情况非常多.提高系统复杂度,造成用户学习困难.
    这其实是一个非常常见的问题,但是一直也没有一个合理的解决办法,以至于大家都默认了这个状态是对的.并不是大家没有注意到问题,而是这真的没有合适的方案.
    回复时间排序方案下,每一个帖子的索引顺序都是动态变化且毫无规律的,可能向前也可能向后.而用户看帖和翻页都是需要一定时间的.单向翻页没办法保证不出现重复和遗漏.任何尝试解决的方案都至少会打破排序规则和页面显示条数这两个限制中的一个.

    所以干脆就不用回复时间排序,这并不是什么好的规则,只能说中规中矩.V 站作为一个社区就没有采用根据回复时间排序的规则,也挺好的.
    信息流现在也不太使用时间排序了不是吗?都是推荐排序了.这可能也算你说的解决方案之一吧.
    tangweihua163
        10
    tangweihua163  
       2019-04-06 15:01:40 +08:00
    “加载更多” ???
    akira
        11
    akira  
       2019-04-06 20:42:51 +08:00
    2l 的方案就是最简单的了。
    后端的方案不是没有,但是都略重
    night98
        12
    night98  
       2019-04-07 04:32:57 +08:00 via Android
    全部取缓存,定时任务刷新缓存,设定 30-120 秒时间刷
    Ultraman
        13
    Ultraman  
       2019-06-21 08:12:51 +08:00
    据观察小草就存在这个问题并且看起来没有被处理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2801 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 13:14 · PVG 21:14 · LAX 05:14 · JFK 08:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.