列表第一页缓存五分钟,期间新增 3 条,用户翻第二页时看到 5 条与第一页重复,运营反馈同一个商品出现两次。日志里能对上时间点,这种反而好排。

分页按 offset 缓存,插入新数据后整体后移,第二页的 offset 对应的记录已经变了。每页独立 key,互相之间没有版本关联。这一点先确认清楚,后面就不用反复试。

SELECT id, title FROM article
WHERE (create_time, id) < (?, ?)
ORDER BY create_time DESC, id DESC LIMIT 20;

围绕「分页缓存错位」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

处理上按这个顺序:分页改用游标 按上一页最后一条的 id 或时间取下一页;缓存 key 带上数据版本 有新写入就换版本;列表缓存 TTL 缩短到一分钟以内。

结果对不对很好判断,新增三条后连续翻五页,没有重复记录,返回总数与列表实际条数一致。

作者 9823189