TL;DR:下面三个选项中,哪一个是使用Redis分页最有效的?
我正在实现一个网站,其中包含多个用户生成的帖子,这些帖子保存在关系数据库中,然后以散列的形式复制到Redis,其中包含像站点:{site_id}: post:{post_id}这样的键。
我想对Redis执行简单的分页查询,以便在Pinterest风格的界面中实现延迟加载分页(即用户向下滚动,我们向服务器发送一个Ajax请求,请求下一批帖子)。
然后,我创建了一个Set来跟踪已发布的帖子id,其中包含像site:{site_id}: post这样的键。我选择了Sets,因为我不想在集合中有重复的ID,并且我可以在每次数据库更新中使用简单的SADD(不需要检查id是否存在)快速完成。
嗯,因为集合不是有序的,我正在计算我必须分页的选项的优缺点:
1) 使用SSCAN命令对已实现的集合进行分页
在这种情况下,我可以将返回的扫描游标保留在用户会话中,然后在下一个请求时将其发送回服务器(多个用户访问和更新数据库时,它似乎不可靠:有时游标将无效并返回奇怪的结果,除非有一些我遗漏的警告)。
2) 重构我的集合以使用列表或排序集
然后我可以使用LRANGE或ZRANGE分页。对于我的用例来说,列表似乎是最有效、最自然的选择。它非常适合分页和按日期排序,但我无法在不循环所有列表的情况下检查单个项目是否存在。排序集似乎结合了集合和列表的优点,但会消耗更多的服务器资源。
3)继续使用常规集,并将页码存储为键的一部分
它类似于site:{site\u id}:{page\u number}:posts
。在执行扫描命令之前,这是推荐的方法。
因此,问题是:哪种方法最有效/最简单?是否有其他未列出的推荐选项?
“最佳”是最佳服务:)
我建议您使用第二种方法,但一定要使用排序集而不是列表。这种类型的作业不仅有意义(请参见ZRANGE
),而且与LRANGE
-ing列表相比,它们的复杂性更高。
我有一个要求,我需要展示一张长桌。它不需要一次全部显示,所以ajax加载它(加载前50条记录,然后每次用户滚动到/超过最后一行的第十行时再获取50行)。 但我不确定分页和无限滚动这两种方式中哪一种更好。我希望用户在返回页面时能够跳转到最后一个滚动到的点(通过后退按钮,当然;如果无论用户何时访问页面,我都可以这样做,那就更好了!)前面的行也可见。同时,为了提高性能,我希望将ajax调用的数量限制在尽
问题内容: 我有一个页面(我们称其为1.php),它使用jQuery-ajax将2.php加载到div- box中。2.php从我的数据库中打印20条记录。当滚动时到达div框的底部时,我希望它加载接下来的20条记录。像Facebook,Twitter等,都是这样做的。 现在,我已经有了这种行为,但是仅当自己加载2.php时!但不在div框中。 我该怎么办? 提前致谢! 问题答案: 文件1.php
问题内容: 我正在尝试抓取这一(无限)页面(www.mydealz.de),但是我无法让我的网络驱动程序向下滚动页面。我正在使用Python(3.5),Selenium(3.6)和PhantomJS。我已经尝试了几种方法,但是webdriver不会滚动- 它只给我第一页。 第一种方法(常用的滚动方法): 第二种方法(只需按下几次向下键并释放它,也尝试在两次按下之间等待): 第三种方法(在“滚动列表
问题内容: 在Bing搜索引擎上搜索图像时,结果显示如下: http://www.bing.com/images/search?q=stack+overflow 请注意,如何保持滚动状态和滚动状态,并且没有“正常”分页。 我的问题是:他们如何做到这一点?我可以看到发生了一些Ajax / javascript事件,但是代码不容易阅读。我特别想知道他们如何知道用户查看端口内是否有“空框”。 问题答案:
我想将我的导航从透明背景更改为白色背景。导航应该缩小,徽标应该消失。 它应该与此页面上的完全相同:https://www.praxis-loeber.de 我已经为它编写了jQuery代码,但不幸的是,它仍然不起作用。 如果有人能告诉我错误在我的代码中,我会非常高兴。 这是我的代码:
我已经在我的应用程序中实现了SwipeRefreshLayout和ViewPager,但有一个大问题:每当我要向左/向右滑动以在页面之间切换时,滚动太敏感了。向下轻扫将触发SwipeRefreshLayout刷新。 我想设置水平滑动开始的时间限制,然后仅强制水平滑动,直到滑动结束。换句话说,当手指水平移动时,我想取消垂直切换。 此问题仅发生在查看页面上,如果我向下滑动并触发刷新功能(显示条),然后