2012-07-27 121 views
0

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

有人可以指点我该怎么做?

编辑:我想做一个“前10”类型的东西,所以它不显示问题的页面,但查询运行所花费的时间量。

+0

缓存+ cron ... – apneadiving 2012-07-27 22:13:54

回答

0

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

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

如果您知道缓存何时过期(基于数据库中的状态或更改),则可以基于此过期缓存。很多时候,我使用创建或更新的字段作为缓存键的一部分来协助完成此过程。

嫉妒实验室和新遗物在缩放导轨屏幕录像中有一些好东西。 http://railslab.newrelic.com/scaling-rails,有点过时,但原则仍然相同。

此外,结帐高速缓存导轨指南。http://guides.rubyonrails.org/caching_with_rails.html

最后,确保索引正确安装,使用thoughtbots张贴在这里:http://robots.thoughtbot.com/post/163627511/a-grand-piano-for-your-violin

输入我的手机上,以便道歉错别字。

0

想一想超出查询。如果您的目标是允许用户查看大量数据,那么可以根据需要抓取这些数据,而不是用一种会让您的用户界面不堪重负的怪异查询来对抗。结果不仅看起来更好,而且速度更快。

我个人对这种模式的技巧是DataTables。这是一个网格,允许您使用Ajax查询(内置)来从您的查询中获取数据,这个数据块是用户希望查看的时间块。它可以对代码进行排序,页面,筛选,限制,甚至搜索。它甚至有一个插件来将结果导出为ex​​cel,pdf等。

Datatables最大的问题是其他人没有的概念叫做“流水线”,它允许你得到一个数量来显示(比如说20)加上额外的金额向前和/或向后。这使您仍然可以进行可管理的查询,但不必每次用户点击“下一页”时都要点击数据库。

我有一个处理数百万条记录的应用程序。所有数据的一个查询将是不可能的......这将花费太长时间。然而,每次抓取25个,闪电般快,不需要任何技巧。一旦数据表上来,我只是表现调整了我的查询,在需要的地方做了一些索引,并且瞧......伟大的响应式应用程序。

这里有一个简单的例子:

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

$('#example').dataTable({ 
    "bProcessing": true, 
    "bServerSide": true, 
    "sAjaxSource": "/processing/file.php" 
}); 
+0

不认为这是我需要的。在我的情况下,每隔几分钟就会向表中添加新数据,因此我的查询返回的平均值可能会每次给我不同的数字。 – Julian 2012-07-27 22:57:53

+0

页面上的自动更新/更新总计很琐碎....重点是您只能在显示UI时获取UI所需的数据。如果你有一个需要几分钟的查询,它要么抓取大量的数据,要么是效率非常低。我可以对包含数百万条记录的表进行复杂的连接,并且仍然可以在5秒内响应用户界面。 – bpeterson76 2012-07-27 23:03:02

+0

抱歉,这是我的错,我没有足够好地描述我的问题。我正在处理前10名列表,所以不是我显示大量数据,而是从数百万行中提取前10名是问题所在。 – Julian 2012-07-27 23:06:54

0

使用高速缓存存储区,允许在一定时间后自动失效。

Memcached做到了,Redis也是我猜!

+0

是的,redis肯定会这样做。 – 2012-07-29 19:35:33

相关问题