2015-09-27 74 views
-1

我刚开始在生产应用程序中使用缓存来加快速度。我已经阅读了主要的Rails指南,各种博客,源码本身等等。但就片段缓存而言,我的头仍不清楚一件简单的事情:Rails如何分段缓存工作?

当您在更新对象后销毁缓存时,你只更新单个对象还是该类?我认为只是单一的对象。

下面是一个例子:

<% @jobs.each do |job| %> 
    <% cache("jobs_index_table_environment_#{session[:merchant_id]}_job_#{job}") do %> 
    stuff 
    <% end %> 
<% end %> 

我在工作的索引页使用上面的代码。每一行呈现了一些信息的用户想要的东西,一些CSS,点击查看个人工作等

我在招聘类写了这个(模型)

after_save do 
    Rails.cache.delete("jobs_index_table_environment_#{merchant_id}_job_#{self}") 
    end 

    after_destroy do 
    Rails.cache.delete("jobs_index_table_environment_#{merchant_id}_job_#{self}") 
    end 

我要在各个作业对象如果它们被更新或销毁,则从缓存中销毁,当然新创建的作业首次在页面上弹出时会获得自己的缓存关键字。

我不会用@jobs做俄罗斯娃娃的东西,因为这是我的“神”对象,并且一直在变化。缓存几乎不会有帮助,因为该集合可能会在一分钟内变形。

我的理解是正确的,在上面的视图中,如果我把第25页的作业渲染到第一页,我会在缓存中获得25个缓存中的对象,然后如果我只更改第一个,缓存的值将被销毁,下一次加载作业页面时,它将被重新缓存,而另外24个只会从缓存中提取?

+0

如果你阅读你的终端输出,你将会看到“写入片段”或“读取片段”的行。我认为检查出来会帮助你弄清楚你的代码在做什么。 – trosborn

回答

0

我也是一名新手,对片段缓存以及我刚刚遇到的一个非常相似的用例,所以我觉得我的(有限的)知识足够新鲜,可以提供帮助。

Trosborn是正确的,您的终端会在您阅读和写入时突出显示您的缓存中有多少“点击”。它应该只在您更改对象时进行写入。根据我上面所看到的,您的删除只是删除单个记录。

不过,我认为这是一个潜在的更简单的做到这一点,这是通过ActiveRecord的对象到缓存中,如方式:

<% @jobs.each do |job| %> 
    <% cache(job) do %> 
    stuff 
    <% end %> 
<% end %> 

阅读this post from DHH这是如何工作的。简而言之,当AR对象传递到缓存时,密钥不仅生成在型号名称上,而且还生成idupdated_at字段。

当内存用完时,废弃的碎片最终会从缓存中移出,因此您不必担心删除旧的缓存对象。

+0

在我的情况下,复杂性是'工作'在各种页面上呈现,并且在实践中,当我尝试使用您指定的方法时,我获得了CSS和所有其他关于customers/show的其他信息/该工作属于特定的客户。只给缓存AR对象是不够的。 – notaceo

+0

你可以使用user'cache [current_user,job]'来补充缓存键,或者用一个特定于视图的字符串:'cache [“这个视图”current_user,job]“来为这个键添加前缀。那会有诀窍吗? –

+0

这是我在第一篇文章中已经完成的内容。问题是“高速缓存是否使所有25条记录无效,或只是记录发生了变化?”我为各种页面设置了正确的唯一键。 – notaceo