我刚开始在生产应用程序中使用缓存来加快速度。我已经阅读了主要的Rails指南,各种博客,源代码本身等等。但是当谈到片段缓存时,我的头脑仍然不清楚:
在更新对象后销毁缓存时,是仅更新单个对象还是类?我认为只是单个对象。
以下是一个例子:
<% @jobs.each do |job| %>
<% cache("jobs_index_table_environment_#{session[:merchant_id]}_job_#{job}") do %>
stuff
<% end %>
<% end %>
我在我的工作索引页面中使用上面的代码。每行都会显示用户想要的一些信息,一些CSS,可点击以查看单个作业等。
我在我的Job类(模型)中写了这个
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 :(得分:0)
我也是片段缓存的新手,我刚刚遇到了一个非常类似的用例,所以我觉得我的(有限的)知识足够新鲜,可以提供帮助。
Trosborn是正确的,您的终端会在您阅读时和您的写入时突出显示,这会显示您在缓存中有多少“点击”。它只应该在您更改对象时写入。根据我在上面看到的内容,您的删除仅删除单个记录。
但是,我认为有一种更简单的方法可以实现这一点,即将ActiveRecord对象传递给缓存,例如:
<% @jobs.each do |job| %>
<% cache(job) do %>
stuff
<% end %>
<% end %>
阅读this post from DHH了解其工作原理。简而言之,当AR对象传递给缓存时,密钥不仅会生成在模型名称上,还会生成在id
和updated_at
字段上。
当内存耗尽时,过时的片段最终会被推出缓存,因此您无需担心删除旧的缓存对象。