当前位置: 首页 > 面试题库 >

使用更改的排序顺序处理分页

郤玉书
2023-03-14
问题内容

我正在创建一个RESTful
Web服务(在Golang中),该服务从数据库中提取一组行并将其返回给客户端(智能手机应用程序或Web应用程序)。该服务需要能够提供分页。唯一的问题是,此数据在定期更改的“计算”列上排序(例如,网站上某内容的“竖起大拇指”或“竖起大拇指”的数量),因此
行可以在在客户的要求之间

我看了一些PostgreSQL功能,可以潜在地用来帮助我解决这个问题,但是似乎没有什么是一个很好的解决方案。

  • 物化视图:用于保存“陈旧的”数据,该数据仅偶尔更新一次。这实际上并不能解决问题,因为如果在更新实例化视图时用户恰好在翻阅数据,数据仍然会跳来跳去。
  • 游标:为每个客户端会话创建并在两次请求之间保留。如果同时存在大量并发会话,这似乎将是一场噩梦。

在客户端或数据库端,有人对如何处理此问题有任何建议吗?我真的有什么可以做的,还是通常由消耗数据的客户端来解决这样的问题?

编辑: 我应该提到,智能手机应用程序允许用户通过“无限滚动”查看更多数据,因此它可以跟踪自己的客户端数据列表。


问题答案:

如果没有完美的令人满意的解决方案,这是一个问题,因为您试图结合本质上不兼容的要求:

  • 仅将所需数量的数据按需发送到客户端,即,您无法下载整个数据集然后在客户端进行分页。

  • 最大限度地减少服务器必须跟踪的每个客户端状态,以实现具有大量客户端的可伸缩性。

  • 为每个客户端维持不同的状态

这是一种“任意选择”的情况。你必须妥协;接受您不能使每个客户端的分页状态保持正确的状态,接受必须将大量数据下载到客户端的信息,或者接受必须使用大量服务器资源来维护客户端状态的信息。

其中有些变化混合了各种折衷,但这就是所有这些。

例如,有些人会向客户发送 一些 额外的数据,足以满足大多数客户的需求。如果客户端超过该限制,则它的分页将失败。

某些系统会在短时间内缓存客户端状态(使用短期未记录的表,临时文件或其他内容),但是会很快过期,因此,如果客户端不经常请求新数据,则它的分页可能会失败。

等等。

也可以看看:

  • 如何为API客户端提供1,000,000个数据库结果?
  • 在PostgreSQL中使用“游标”进行分页
  • 遍历大型外部postgres db,操作行,将输出写入rails postgres db
  • 偏移/极限性能优化
  • 如果PostgreSQL count(*)总是很慢,如何对复杂的查询进行分页?
  • 如何从数据库一一返回示例行

我可能会实现某种形式的混合解决方案,例如:

  • 使用游标读取并立即将数据的第一部分发送给客户端。

  • 立即从游标中获取足够的额外数据,以满足99%的客户要求。将其存储到诸如memcached,Redis,BigMemory,EHCache之类的快速,不安全的缓存中,无论使用哪种密钥,该密钥都可以让我检索它以供同一客户端以后的请求。然后关闭光标以释放数据库资源。

  • 至少在最近使用的基础上使高速缓存过期,因此,如果客户端不能保持足够快的读取速度,则必须从数据库中获取一组新的数据,并且分页会更改。

  • 如果客户端希望获得比绝大多数同行更多的结果,那么在您切换到直接从数据库而不是从缓存读取数据或生成新的更大的缓存数据集时,分页有时会发生变化。

这样,大多数客户端将不会注意到分页问题,​​并且您不必向大多数客户端发送大量数据,但是您不会融化数据库服务器。但是,您需要一个很大的缓存来解决此问题。它的实用性取决于您的客户是否可以应对分页中断-
如果根本无法接受分页中断,那么您将不得不在游标,临时表,在第一次请求时处理整个结果集等方面在数据库端进行操作。它还取决于数据集的大小以及每个客户端通常需要多少数据。



 类似资料:
  • 我使用的是,它用于根据中的当前查询筛选中的数据,如如何使用SearchView筛选RecyclerView中所述。 问题是项目的顺序也必须能够改变。通过具有方法的类与交互。如果用户更改了项目的排序方式,我需要更改它,但我不确定如何做到这一点。 当前的情况只需要颠倒顺序,所以这个问题可以通过和来解决,但我想知道如何提供一种完全不同的方式来排序中的项目。

  • 为了从C#连接到DB2,我们使用IBM Data Server Client10.5FP5 package->managed.NET驱动程序。 对于来自客户端Acccess for System i-package的本机.NET驱动程序,支持将附加关键字(sortSequence/language)与ConnectionString一起传递。 为了在ibm.data.db2-drivers特性中具

  • 22.2.3 DispatcherServlet的处理顺序 在设立了一个DispatcherServlet并且收到一个对该特定DispatcherServlet的请求之后,这个DispatcherServlet将按如下顺序开始处理该请求: 搜索WebApplicationContext,并将其绑定为请求中的一个属性,以使控制器和进程中的其他元素能够使用它。默认情况下,绑定在DispatcherSe

  • 问题内容: 我需要能够增加和减少对象中数组元素的位置。 我在MongoDB API中 查看了该API,但找不到任何让我这样做的东西。 我正在尝试使用贯通,并且我知道要向上或向下移动的元素的索引。 编码图像数组项的示例: 我想向上或向下移动“ img2”(但由于无处可去,因此“图像”应该不能向上推)。 如果我想向上推“ img2”,那么结果将是: 通过更改索引,交换或上推/下推来实现此目标都没有关系

  • 问题内容: 如果我做 我懂了 如果我做 我懂了 我想做的就是以2、3、4升序(左侧数字列)获得输出。我可以以某种方式更改value_counts还是需要使用其他函数。 问题答案: 我认为您需要,因为调用了左列。完整命令为。例如:

  • -路径:/APP2/** 这意味着与其使用身份验证->路由映射->过滤web处理程序,不如使用路由映射->身份验证->过滤web处理程序。这三个组件并不是不相似,它们中的一个是过滤器,另一个是映射器,最后一个是web处理程序。现在我知道如何自定义它们,但问题是我不知道如何拦截Netty服务器构建过程,以便更改这些操作的顺序。我需要等待构建过程结束,并在开始之前更改服务器的内容。我怎么能那么做?