Rails Rails 4 中 关于 cache 的疑问

shangrenzhidao · 2014年10月16日 · 最后由 shangrenzhidao 回复于 2014年10月16日 · 2073 次阅读

在 Agile Rails 上看到这样一段代码,也查找了相关资料,还是有些疑惑。

def self.latest 
  Product.order(:updated_at).last
end
 <% 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 %>
  1. 官方文档中的 cache 是个方法,这里是不是把数组作为 key(参数)了?
  2. 那么‘store’和’entry’表示什么呢?
  3. 这个缓存的意思是不是在用户浏览器端存放只包含这个集合的一个文件呢?
  4. key 是通过集合计算出来的话,如果开发者修改了 view 的代码,这时候应该需要重新缓存,该怎么解决?
  5. cache ['store', Product.latest] 是不是多余呢?从数据库中拿出最新更新的记录然后拼成一个 key,但是后面遍历的却是 product,怎么影响到了后面的数据?

https://ruby-china.org/topics/21488 精华区里有几篇缓存的文章,看我收藏

我的理解:

  1. 是的,会调用 cache_key 方法
  2. 是前缀,用于构造缓存的 key
  3. 缓存的优点在于服务器端可以不用再渲染页面,直接取缓存就可以了,这里是部分页面缓存。如果是整页缓存的话,就可以通过比较 etag 直接返回 304。
  4. 如果 cache 里面的结构内容变化的话,只能手动把相应缓存清空了吧

谢谢,这篇文章写得太好了

#1 楼 @loveltyoic cache ['store', Product.latest] 是不是多余呢?从数据库中拿出最新更新的记录然后拼成一个 key,但是后面遍历的却是 product,怎么影响到了后面的数据?

这就是套娃机制啊,如果所有 Product 都没变化,直接取出整个缓存,再里面一层的都不用 care 的了。 反之,比如说新加了一条 product,最外层的 key 会发生变化,缓存失效,此时会重新组织页面。原来的每个 product 的缓存还是有效的,只需要为新增 product 做渲染,然后加进去。这样又组织出来最外层的一个缓存,直到有 product 发生变化。

#5 楼 @loveltyoic 哦,原来是一层层触发的,终于明白了,嘿嘿太感谢了。新人,啥也不懂,见笑了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号