2014-04-21 33 views
0

我正在使用Rails4编写敏捷Web开发书,我刚刚阅读了关于缓存视图各部分以避免压倒数据库的(第一部分)部分。 我当然在开发环境的配置中将缓存选项设置为true。Rails4在敏捷Web开发中使用Rails4

问题是缓存似乎没有工作。 这里是我的应用程序/视图/存储/ index.html.erb文件,酷似书中给出的,启用缓存:

<% if notice %> 
    <p id="notice"><%= notice %></p> 
<% end %> 

<h1>Your Pragmatic Catalog</h1> 

<% cache ['store', Product.latest] do %> 
    <% @products.each do |product| %> 
    <% cache ['entry', product] do %> 
     <div class="entry"> 
     <%= image_tag(product.image_url) %> 
     <h3><%= product.title %></h3> 
     <%= sanitize(product.description) %> 
     <div class="price_line"> 
      <span class="price"><%= number_to_currency(product.price) %></span> 
     </div> 
     </div> 
    <% end %> 
    <% end %> 
<% end %> 

这里是Rails服务器记录,充分显示出DATABSE在多次访问(虽然行提到缓存):http://pastebin.com/v2jGiHKL

这里是我的应用程序/视图/存储/ index.html.erb文件,其中我尝试别的东西缓存:

<% if notice %> 
    <p id="notice"><%= notice %></p> 
<% end %> 

<h1>Your Pragmatic Catalog</h1> 

<% cache('caching') do %> 
    <% @products.each do |product| %> 
     <div class="entry"> 
     <%= image_tag(product.image_url) %> 
     <h3><%= product.title %></h3> 
     <%= sanitize(product.description) %> 
     <div class="price_line"> 
      <span class="price"><%= number_to_currency(product.price) %></span> 
     </div> 
     </div> 
    <% end %> 
<% end %> 

这里是相应的日志,显示出cach ing是成功的(因为数据库没有被查询):http://pastebin.com/ZTk9A9RA

有人可以解释为什么一个似乎工作,而不是其他,或者第一个应该如何工作?谢谢:)

请注意,在本书中,它说,启用缓存后,如果更改是在缓存块内进行的,则重新加载商店页面不应显示store/index.html.erb的新部分;但它确实在两种情况下。任何想法 ?

+0

在您的第一个日志中,只有一个“GET”/“'。你也可以向我们展示控制器吗? –

+0

是不是因为我在第二种情况下只访问过一次页面,在第一种情况下是两次?(在这种情况下,你的意思是相反的,对吧?) 总之,这里是我的控制器: http://pastebin.com/J6dpxe7D 而 http://pastebin.com/aKTUFX82 – GraawrImaTiger

回答

1

您传递给cache API的参数是缓存密钥。该密钥的散列函数是缓存片段将存储在哪里以及它将被查找的位置。

在您的代码(cache('caching'))中,缓存键是硬编码的,并且永远不会更改,因此,除非缓存失效(无论是在代码中手动还是TTL已经通过) - 将发送相同的片段给客户。

在书(cache ['store', Product.latest])的代码中,关键取决于最新产品。这意味着如果最新的产品发生变化(另一个产品被添加或更新) - 下一次调用将自动'知道'不从缓存中取出页面,而是重新创建缓存。

什么是日志显示:

[1m[35mProduct Load (0.3ms)[0m SELECT "products".* FROM "products" ORDER BY "products"."updated_at" DESC LIMIT 1 

实际上是Product.latest结果,Product.all。总结 - 两个代码片段都被缓存,但在示例代码中,(小)命中数据库以验证缓存的有效性,即页面是否被缓存。

如果您自己使缓存无效,则可以保留代码的硬编码版本,但如果不是,则最好考虑失效方案,无论它是否像示例代码所示或其他内容。

+0

好吧,我明白了,非常感谢:) 因此,在Rails中,更常见的做法是每次在DB中更改重要内容时手动使缓存失效,还是让缓存的片段使用动态密钥处理它们会更好? – GraawrImaTiger

+0

我认为这里有一些变量,这取决于用例(显示_latest_数据与数据库可能承受多少负载的关键点),但我相信,除非您对数据库非常担心,否则让这个工作可能会更简单。 –

+0

好了,再次感谢。 – GraawrImaTiger