【问题标题】:rails4 caching naming conventionsrails4 缓存命名约定
【发布时间】:2016-07-20 01:54:10
【问题描述】:

我有一个 rails 4 应用程序。我必须以某种方式区分不同的缓存键,但不知道命名约定。

第一个例子:

我有一个带有indexcompleted_tasksincoming_tasks 操作的任务模型。由于分页,A 具有相同的实例名称 (@tasks)。

目前缓存键的名称如下所示。我的问题: 1. 缓存键结构是否足够好? 2. 我将键的各个部分放入数组中的顺序是否重要?比如[@tasks.map(&:id), @tasks.map(&:updated_at).max, 'completed-tasks']['completed-tasks', @tasks.map(&:id), @tasks.map(&:updated_at).max]好?

completed_tasks.html.erb

<% cache([@tasks.map(&:id), @tasks.map(&:updated_at).max, 'completed-tasks']) do %>
  <%= render @tasks %>
<% end %>

tasks.html.erb

<% cache([@tasks.map(&:id), @tasks.map(&:updated_at).max]) do %>
  <%= render @tasks %>
<% end %>

incoming_tasks.html.erb

<% cache([@tasks.map(&:id), @tasks.map(&:updated_at).max, 'incoming-tasks']) do %>
  <%= render @tasks %>
<% end %>

第二个例子:

我也对russian-doll-caching 的命名约定有疑问:

products/index.html.erb

<% cache([@products.map(&:id), @products.map(&:updated_at).max]) do %>
  <%= render @products %>
<% end %>

_product.html.erb 

<% cache(product) do %>
  <%= product.name %>
  ....
<% end %>

这个版本是否足够好,或者我总是应该在外部和内部缓存键数组中放置一些字符串,以避免其他页面上类似命名的缓存键出现问题。例如,我计划将&lt;% cache(@product) do %&gt; 放在profile#show 页面上,这与我的示例中的内部缓存完全相同。如果键必须不同,rails 约定将内部缓存键命名为外部缓存键是什么?

【问题讨论】:

    标签: ruby-on-rails caching fragment-caching


    【解决方案1】:

    首先,根据俄罗斯娃娃缓存文章,我认为没有必要自己设置cache_key,你可以把它留给rails,它会自动生成cache_key。例如,@tasks = Task.incomingcache_key 应该与 @tasks = Task.completed 不同,类似于 views/task/1-20160330214154/task/2-20160330214154/d5f56b3fdb0dbaf184cc7ff72208195eviews/task/3-20160330214154/task/4-20160330214154/84cc7ff72208195ed5f56b3fdb0dbaf1

    cache [@tasks, 'incoming_tasks'] do
      ...
    end
    

    其次,对于命名空间,虽然模板摘要相同,但@tasks摘要会有所不同。所以在这种情况下,没有命名空间似乎没问题。

    cache @tasks do
      ...
    end
    

    第三,说到命名空间,我更喜欢前缀而不是后缀。即

    cache ['incoming_tasks', @tasks] do
      ...
    end
    

    作为第二个例子,我认为这样就可以了。

    <% cache @product do # first layer cache %>
      <% cache @products do # second layer cache %>
        <%= render @products %>
      <% end %>
    
      <% cache @product do # second layer cache %>
        <%= product.name %>
        ....
      <% end %>
    <% end %>
    

    app/views/products/show.html.erb 的缓存键类似于views/product/123-20160310191209/707c67b2d9fb66ab41d93cb120b61f46。最后一点是模板文件本身及其所有依赖项的 MD5。如果您更改模板或任何依赖项,它就会更改,从而允许缓存自动过期。

    进一步阅读:https://github.com/rails/cache_digests

    【讨论】:

    • abookyun,我的问题结构有点奇怪。您能否告诉我您的答案的某些部分是否指的是我的第二个示例(我故意使用@product 与第一个示例区分开来)?
    • @SzilardMagyar 我更新了答案,请看最后一部分。
    • abookyun,我更新了我的问题的第二部分,有点模棱两可,所以你误会了。
    • abookyun,你能看看这个吗? stackoverflow.com/questions/36460001/…
    【解决方案2】:

    最好总是将字符串放在末尾。它真的只需要对你有意义。

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2012-08-10
      • 2011-02-22
      • 2011-02-07
      • 2012-02-08
      相关资源
      最近更新 更多