Redis分页策略的优缺点

Raf*_*kel 17 language-agnostic pagination lazy-loading redis

TL; DR:以下三个选项中哪一个对Redis进行分页最有效?

我正在实现一个包含多个用户生成的帖子的网站,这些帖子保存在关系数据库中,然后以哈希的形式复制到Redis,其中包含密钥site:{site_id}:post:{post_id}.

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

然后我创建了一个Set来跟踪已发布的帖子ID,其中包含键site:{site_id}:posts.我选择了Sets因为我不希望在集合中有重复的ID,我可以使用简单的SADD快速完成它(不需要检查是否存在id).

好吧,由于套装没有订购,我正在考虑我必须分页的选项的优缺点:

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

在这种情况下,我可以将返回的扫描光标保留在用户的会话中,然后在下次请求时将其发送回服务器(对于多个用户访问和更新数据库,这似乎不可靠:在某些时候光标将无效并且返回奇怪的结果 - 除非有一些我不知道的警告).

2)修改我的设置使用列表有序集合,而不是

然后我可以使用LRANGEZRANGE进行分页.列表似乎是我的用例中性能最高且最自然的选项.它非常适合按日期分页和排序,但我根本无法在不循环所有列表的情况下检查单个项目是否存在.排序集似乎加入了集和列表的优点,但消耗更多的服务器资源.

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

它会是这样的site:{site_id}:{page_number}:posts.这是扫描命令实施之前的推荐方法.

所以,问题是:哪一个是最有效/最简单的方法?这里没有列出任何其他推荐选项吗?

Ita*_*ber 8

"最好的"最好服务主观:)

我建议你使用第二种方法,但绝对使用排序集超过列表.这种类型的工作不仅具有意义(参见参考资料ZRANGE),与复杂的工作相比,它们在复杂性方面也更有效率LRANGE.

  • 你的评论(和回答)让我更深入地研究了 LRANGE [ O(S+N) ] 和 ZRANGE [ O(log(N)+M) ] 之间的区别,并发现它可能是巨大的!此外,它让我看到了这篇[来自 Reddit 的旧但黄金帖子](https://www.reddit.com/r/programming/comments/1f2ml3/what_does_olog_n_mean_exactly/),它非常清楚地解释了 O(log n)道路。里面的评论太搞笑了!!嗯,答案被接受。干杯。 (4认同)