0

我有一个Rails 4.1应用程序,它在特定页面上检索订单列表并在表格中列出它们。请务必注意,根据登录的用户,列表不同。集合的Rails碎片缓存

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

_order_list.html.erb

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

_order.html.erb

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

不过,我不确定缓存(@orders)。那么所有的用户都会得到相同的一组缓存@order(这是不需要的)吗?

换句话说,我如何确保为每个用户分别缓存@orders的整个集合?

回答

2

那么所有的用户都会被送到同一组缓存@order( 不需要)吗?

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

因此,假设我们检索@orders这样的:

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

我们会得到缓存观点与这样的邮票:

的意见/命令/ -20131202075718784548000 /订单/ -20131220073309890261000/orders/-20131223112753448151000/6da080fdcd3e2af29fab811488a953d0

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

但在这里谈到你的做法的一些伟大的缺点:

  1. 页面缓存总是存储在磁盘上。这意味着您不能拥有任何所需长度的页面戳。只要您一次检索到大量的订单,就会超出操作系统对文件名的限制(例如,对于Linux,它的长度为255字节),并最终导致运行时错误。
  2. 订单是动态内容。一旦至少有一个更新,您的缓存将变为无效。生成缓存并将其保存到磁盘是相当耗时的操作,所以最好单独缓存每个订单。在这种情况下,您将不得不为单个订单重新生成缓存,而不是重新生成整个大规模集合的缓存。