回答

收藏

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

技术问答 技术问答 200 人阅读 | 0 人回复 | 2023-09-14

我正在创造一个RESTful- T3 b3 p6 }: d( D
Web服务(在Golang中中间),该服务从数据库中提取一组返回客户端(智能手机应用程序或Web应用程序)。该服务需要能够提供分页。唯一的问题是,该数据在定期更改的计算列中排名(例如,网站上竖起拇指或竖起拇指的数量),因此4 m- I6 M% Q( z9 O; I3 ~& ?
可以在客户要求之间行动    。
1 z8 E- b) \! f我看了一些PostgreSQL这个功能可以用来帮助我解决这个问题,但似乎没有什么是好的解决方案。
' V$ C7 t; r& m/ z* t3 X物化视图:用于保存旧数据,偶尔只更新一次。这实际上并不能解决这个问题,因为如果用户只是在更新实例视图时浏览数据,数据仍然会跳跃。
* Z1 e5 Z  \+ l) `# c" B游标:为每个客户端的会话创建并保留在两个请求之间。如果同时有大量的并发会话,这似乎是一场噩梦。
在客户端或数据库端,有人对如何处理这个问题有任何建议吗?我真的能做什么,还是通常消耗数据来解决这个问题?
$ @6 N- u3 o0 X2 M2 z; z# U9 M编辑:    我应该提到,智能手机应用程序允许用户通过无限滚动查看更多数据,从而跟踪他们的客户数据列表。9 v0 r# B& r. z5 z) \
                                                                ) c. `# `3 J% E; n2 \; @
    解决方案:                                                                . [! b& h4 a  B& Y) b) g( i/ F
                                                                如果没有完美令人满意的解决方案,这是一个问题,因为你试图结合本质上不兼容的要求:# d% K, s2 [0 g
只需按需将所需数量的数据发送到客户端,即您无法下载整个数据集并在客户端分页。2 p: w: G+ g7 L2 ^  B' C, h
尽量减少服务器必须跟踪的每个客户端状态,以实现大量客户端的可伸缩性。
$ [/ z3 L9 y; z% K9 J为每个客户端保持不同的状态
5 |# d" G3 \" K+ ~! y2 i. f7 X
这是一种任意选择的情况。您必须妥协;接受您不能保持每个客户端的页面状态正确,接受必须将大量数据下载到客户端的信息,或使用大量服务器资源来维护客户端状态的信息。5 [: g7 u" \* A, H0 R, X6 b6 I: t3 {
有些变化混合了各种折衷,但这就是全部。
& b: h" S2 g2 d: g9 u4 [; d" L6 `- \例如,有些人会向客户发送 一些    额外的数据足以满足大多数客户的需求。如果客户端超过此限制,其分页将失败。
! T+ `/ }4 ?. D; }" x# D0 r9 q有些系统会在短时间内缓存客户端状态(使用短期未记录表、临时文件或其他内容),但很快就会过期。因此,如果客户不经常要求新数据,其分页可能会失败。  ]  h- q6 w0 c$ r$ G3 o
等等。
, o4 S6 Z  S/ r4 l也可以看:
/ H1 {( g8 }- ~/ g- y3 B$ B2 x如何为API客户端提供1万个数据库结果?; ?) k2 a7 _$ C, n! e" M% F1 E
在PostgreSQL游标用于分页
. F2 p+ A8 T( X+ e2 U# x遍历大型外部postgres db,操作行,写入输出rails postgres db$ C2 L# n! \2 \" E
偏移/极限性能优化! a* ^' v% k" {0 Y: N6 J$ l
如果PostgreSQL count(*)总是很慢,如何分页复杂的查询?, p9 b( o0 u5 W7 Q
如何从数据库一一返回示例
我可以实现某种形式的混合解决方案,例如:
+ X; Z# [* e# v  R% ]# G( E7 R使用游标读取并立即将数据的第一部分发送给客户端。
) r+ K* Q* n' H" O# @# I为了满足99%客户要求。存储在其中memcached,Redis,BigMemory,EHCache在快速和不安全的缓存中,无论使用哪种密钥,密钥都可以让我在同一客户端的未来搜索它。然后关闭光标以释放数据库资源。
- G" L4 O- v3 ?7 B8 C. R* l3 y高速缓存至少在最近使用的基础上过期。因此,如果客户端不能保持足够快的读取速度,则必须从数据库中获取一组新数据,并更改分页。
0 ?* e" k. w$ Y如果客户想要得到比大多数同行更多的结果,分页有时会改变,当您切换到直接从数据库而不是从缓存读取数据或生成新的更大的缓存数据集时。1 Z4 y& X4 F" c3 D" B
这样,大多数客户端就不会注意到分页问题,你也不必向大多数客户发送大量数据,但你不会融化数据库服务器。然而,你需要一个大的缓存来解决这个问题。它的实用性取决于您的客户是否能处理分页中断-3 L% \6 ~4 N: U2 C" V/ M; {7 A  ^
如果您不能接受分页中断,您将不得不在数据库端操作游标、临时表和第一次请求时处理整个结果集。它还取决于数据集的大小以及每个客户端通常需要多少数据。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则