0

我有一个 rails 4.1 应用程序,它在特定页面上检索订单列表并将它们列出在表格中。请务必注意,列表因登录用户而异。

为了提高性能,我希望缓存每个订单行的部分。我正在考虑这样做:

_order_list.html.erb

<% cache(@orders) do %>
    <%= render @orders %>
  <% end %>

_order.html.erb

<% cache(order) do %>
  ...view code for order here
<% end %>

但是,我不确定集合的缓存(@orders)。那么所有用户都将获得相同的缓存@orders 集(这是不希望的)吗?

换句话说,如何确保为每个用户单独缓存整个 @orders 集合?

4

1 回答 1

2

那么所有用户都将获得相同的缓存@orders 集(这是不希望的)吗?

实际上cache_digests并不缓存@orders自己。html它为特定的给定对象或一组对象(例如@orders)缓存部分页面。每次用户请求网页时,@orders都会在控制器操作中设置变量,并将其digest与缓存的摘要进行比较。

所以,假设我们这样检索@orders

def index
  @orders = Order.where(:id => [1,20,34]).all
end

我们将得到的是带有这样标记的缓存视图:

浏览次数/订单/ 1 -20131202075718784548000/订单/ 20 -20131220073309890261000/订单/ 34 -20131223112753448151000/6da080fdcd3e2af29fab811488a953d0

请注意,ids该标记中提到了检索到的订单,因此每个拥有自己独特订单集的用户都应该获得他/她自己的缓存视图。

但是,您的方法有一些很大的缺点:

  1. 页面缓存始终存储在磁盘上。这意味着您不能拥有任何所需长度的页戳。一旦您一次检索到大量订单,您就会超出操作系统对文件名的限制(例如,对于 linux,它是 255 个字节)并最终导致运行时错误。
  2. 订单是动态内容。只要其中至少一个更新,您的缓存就会失效。缓存生成并将其保存到磁盘是一项非常耗时的操作,因此最好单独缓存每个订单。在这种情况下,您将不得不为单个订单重新生成缓存,而不是重新生成整个海量集合的缓存。
于 2014-10-01T18:39:51.443 回答