0

我有一个查询需要大约一分钟才能完成,因为它处理大量数据,但我也想将结果放在网站上。显而易见的结论是缓存它(对吗?),但随着时间的推移数据会发生变化,我需要一种方法来自动重新制作缓存页面,可能每 24 小时一次。

有人可以指出我该怎么做吗?

编辑:我想做一个“前 10 名”类型的东西,所以它不显示问题所在的页面,而是显示查询运行所需的时间。

4

3 回答 3

0

想一点超出查询。如果您的目标是允许用户查看大量数据,那么请随心所欲地获取这些数据,而不是与将淹没您的 UI 的怪物查询作斗争。结果不仅看起来更好,而且速度更快。

我对这种模式的个人技巧是DataTables。它是一个网格,允许您使用 Ajaxed 查询(内置)在用户想要查看的时间从查询中获取数据“块”。它可以通过对代码的一些简单添加来排序、分页、过滤、限制甚至搜索。它甚至还有一个插件可以将结果导出为 excel、pdf 等。

Datatables 拥有而其他人没有的最大的东西是一个称为“流水线”的概念,它允许您获得要显示的数量(比如 20)以及向前和/或向后的额外数量。这使您仍然可以进行可管理的查询,但不必每次用户点击“下一页”时都点击数据库

我有一个处理数百万条记录的应用程序。对所有数据进行一次查询是不可能的......这将花费太长时间。然而,一次抓取 25 个是闪电般的速度,不需要任何技巧。数据表启动后,我只是对查询进行了性能调整,在需要的地方进行了一些索引,瞧……很棒的响应式应用程序。

这是一个简单的例子:

<table id="example"></table>

$('#example').dataTable( {
    "bProcessing": true,
    "bServerSide": true,
    "sAjaxSource": "/processing/file.php"
} );
于 2012-07-27T22:42:08.057 回答
0

使用允许在一定时间后自动过期的缓存存储。

Memcached 做到了,我猜 Redis 也是!

于 2012-07-27T22:44:34.687 回答
0

使用 24 小时 TTL(到期)缓存查询结果可能会正常工作。假设这是页面的一块,请使用片段缓存。

您可以按照说明设置 memcached 或 redis 来存储缓存。您可以做的另一件事是设置每 24 小时(或根据需要)预热缓存的作业,这样不幸的用户就不必为您生成缓存。

如果您根据数据库中的状态或更改知道缓存何时过期,则可以根据该状态使缓存过期。很多时候,我使用 created at 或 updated at 字段作为缓存键的一部分来协助此过程。

envy labs 和 new relic 的缩放轨道截屏视频中有一些好东西。http://railslab.newrelic.com/scaling-rails,有点过时但原理还是一样的。

此外,请查看缓存导轨指南。http://guides.rubyonrails.org/caching_with_rails.html

最后,确保索引设置正确,在此处使用 thinkbots 帖子:http ://robots.thoughtbot.com/post/163627511/a-grand-piano-for-your-violin

在我的手机上打字所以对错别字表示歉意。

于 2012-07-29T19:33:54.433 回答