我的API响应查询,这些查询可能返回大约100,000个名为MOF的模型。每个模型都有一个名为“pregen_json”的json列,用于缓存模型的当前状态。这是缓存的,因为实时生成json太慢了(~40 is /model* 100,000型号=1 Hr)。下面是模式(运行mySQL) +代码的相关部分:
模式:
create_table "mofs", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
...
t.json "pregen_json"
end主计长:
# some filtering of @mofs to respond to search query omitted
render :json => @mofs.pluck(:pregen_json)基于@mofs m:s长度的下载时间
1,000 -> 0:10
10,000 -> 2:00
100,000 --> 7:00
基本上,用户在没有数据的情况下看到90%的等待时间,然后在服务器准备响应后立即发送所有内容。
寻找如何加快这一进程的建议。
发布于 2019-11-22 19:04:40
通常,为了避免非常长的API调用,人们会对结果进行分页。客户端请求一个特定的页面(和/或一定数量的结果),而服务器只返回该页面。
有许多分页红宝石,如威尔·帕格纳或卡米纳里,将帮助您这样做。
否则,使用限制和偏移Model.limit(PAGE_SIZE).offset(PAGE_SIZE * page_number)实现基本分页是相当简单的。
您可能需要添加按钮,以便客户端可以选择要加载的页面。如果您希望加载所有内容,那么您可以创建一个循环,该循环一直请求下一个页面,直到不再返回数据为止。这里的优点是数据将随着时间的推移加载,而不是在很长一段时间后一次性加载。
除此之外,我感到惊讶的是,创造10万记录需要7分钟。您可能只想在预先生成的JSON中添加必要的信息,以限制从数据库中提取到客户端的数据量。
希望这能帮你做决定。祝好运!
https://stackoverflow.com/questions/58998882
复制相似问题