游标分页与曝光去重

为什么不用 offset 分页

传统分页是 offset + limit。但推荐结果会随时间、用户行为、实验策略变化——上次的「第 20 条」这次可能已经不是同一条了。用 offset 分页会:

  • 重复:用户看到已看过的内容。
  • 漏数据:中间的内容被跳过。
  • 不稳定:策略一变,顺序全乱。

游标分页

Feed 通常用游标分页:

GET /feed?cursor=xxx&limit=20

游标里可以包含:

  • 用户标识。
  • 请求时间。
  • 已曝光集合摘要。
  • 策略版本。
  • 候选池位置。

服务端据此生成下一批结果,保证「不重不漏」地往下续。

曝光去重

用户不希望短时间反复看到同一条视频。系统需要记录曝光历史:

  • 最近已曝光视频集合。
  • 已完整播放或快速跳过的视频。
  • 不感兴趣和举报的视频。
  • 作者维度的重复控制。

曝光数据存哪

曝光记录可以按用途分层:

用途存储时效
在线去重Redis(近期曝光集合)短期
离线训练用户行为存储(完整曝光)长期
  • 在线去重要求低延迟,用 Redis 的集合 / 位图。
  • 离线训练需要完整历史,落行为日志。

刷新策略

用户主动下拉刷新时,期望看到「新内容」而不是同一批:

  • 刷新时带上 refresh_token / 时间戳,服务端优先返回新候选。
  • 新内容不足时,用「未曝光但稍旧」的内容补齐。
  • 避免刷新前后几乎一模一样。

一句话

游标分页 + 曝光去重,是 Feed「稳定、不重、可刷新」的基础。它把「用户看到哪」变成可管理的数据,也为后面的推荐算法铺好地基。

下一节处理没有行为历史的用户——冷启动。

发现内容有问题?

告诉我们哪里需要改进。