Pagination 无限滚动页面的Redis分页策略

Pagination 无限滚动页面的Redis分页策略,pagination,redis,language-agnostic,lazy-loading,Pagination,Redis,Language Agnostic,Lazy Loading,TL;DR:以下三个选项中,哪一个是使用Redis分页最有效的 我正在实现一个包含多个用户生成帖子的网站,这些帖子保存在关系数据库中,然后以键的形式复制到Redis,如site:{site\u id}:post:{post\u id} 我想对Redis执行简单的分页查询,以便在Pinterest风格的界面中实现延迟加载分页(即用户向下滚动,我们向服务器发送一个Ajax请求,请求下一批帖子) 然后,我创建了一个用于跟踪已发布帖子id的工具,使用类似于site:{site\u id}:posts的键

TL;DR:以下三个选项中,哪一个是使用Redis分页最有效的

我正在实现一个包含多个用户生成帖子的网站,这些帖子保存在关系数据库中,然后以键的形式复制到Redis,如
site:{site\u id}:post:{post\u id}

我想对Redis执行简单的分页查询,以便在Pinterest风格的界面中实现延迟加载分页(即用户向下滚动,我们向服务器发送一个Ajax请求,请求下一批帖子)

然后,我创建了一个用于跟踪已发布帖子id的工具,使用类似于
site:{site\u id}:posts
的键。我之所以选择集合,是因为我不希望集合中有重复的id,而且我可以在每次数据库更新时通过简单的方法(无需检查id是否存在)快速完成

好吧,由于布景没有定购,我正在权衡我必须分页的选项的利弊:

1)使用命令对已实现的集合进行分页

在这种情况下,我可以将返回的扫描游标持久保存在用户的 会话,然后在下一个请求时将其发送回服务器(看起来不是 具有多个用户访问和更新数据库的可靠性:在 有时光标会无效并返回奇怪的结果- 除非我遗漏了一些警告)

2)重构我的集合以使用或替代

然后我就可以用or来分页了。这个名单似乎 对于我的用例来说,这是最有效、最自然的选择。它是 非常适合分页和按日期排序,但我无法检查 在不循环所有列表的情况下存在单个项目。排序集 似乎结合了集合和列表的优点,但消耗更多 服务器资源

3)继续使用常规集,并将页码存储为键的一部分

它类似于
site:{site\u id}:{page\u number}:posts
。信息技术 是在执行扫描命令之前执行的

因此,问题是:哪种方法最有效/最简单?这里没有列出其他推荐选项吗?

“最佳”是最佳服务:)


我建议您使用第二种方法,但一定要使用排序集而不是列表。这不仅对这类工作有意义(请参阅),而且在复杂性方面,与列出一个列表相比,它们的效率更高。

“最佳”完全是主观的。对我最好的并不一定对你有好处。使用列表不是一个好的选择,因为LRANGE是O(N)。使用排序集-最简单和最干净。@SergioTulentsev是的,也许“最好”不是。。。最好的词。我会考虑一些不那么主观的问题,然后编辑这个问题。Thanks@ItamarHaber我正在研究其他排序集的命令和结构。你说得对,这绝对是最干净的方式,而且查询速度非常快。谢谢你能把这个作为一个答案,这样我就可以接受了吗?你的评论(和答案)让我更深入地研究了LRANGE[O(S+N)]和ZRANGE[O(log(N)+M)]之间的区别,并发现它可能是巨大的!同时,它也让我明白了这一点,它以一种非常清晰的方式解释了O(logn)。那里的评论真他妈的好笑!!好吧,答案是可以接受的。干杯