【问题标题】:Caching paginated data for scrolling interface and avoid client side duplicates为滚动界面缓存分页数据并避免客户端重复
【发布时间】:2013-09-30 10:06:07
【问题描述】:
基本上是这样设置的:
您有许多市场商品,您想按价格对它们进行排序。如果有人浏览时缓存过期,他们会突然看到潜在的重复条目。这似乎是一种非常糟糕的公共 API 体验,我们正在努力避免这个问题。
我见过的一些基本哲学包括:
- Reddit,他们在其中跟踪客户端看到的最后一个 id,但他们仍然处理重复项。
- Will Paginate,这是一个简单的实现,它基本上根据您想要返回的多个项目和一个偏移量返回结果
- 然后有很多不同的解决方案,涉及到 Redis 排序集等。但这些也并不能真正解决如何删除重复条目的问题
有没有人有相当可靠的方法来处理分页排序的动态列表而不会重复?
【问题讨论】:
标签:
ruby-on-rails
postgresql
pagination
redis
【解决方案1】:
如果您需要分页的项目已正确排序(在唯一值上),那么您唯一需要做的就是按该值而不是偏移量选择结果。
简单的 SQL 示例
SELECT * FROM items LIMIT 10; /*page 1*/
假设第 10 行的 id = 42(id 是主键)
SELECT * FROM items WHERE id < 42 LIMIT 10; /* page 2*/
如果您使用的是 postgresql(可能 mysql 也有同样的问题),这也解决了使用 OFFSET 在性能方面糟糕的问题(OFFSET N LIMIT M 需要扫描 N 行!)
如果排序不是唯一的(例如,对创建时间戳进行排序可能导致同时创建多个项目),您将遇到重复问题