我有一段代码如下:
<% cache [:resource, @page.id.to_s] do %>
<% content_for :title do %>
<title><%=@page.title %></title>
<% end %>
第一次跑的时候,没有问题。但是缓存之后,标题就变成了 undefined。 于是只能改成这样,把标题的部分放在混存外面,每次刷新页面,其他都缓存了,但是 title 还是需要去读数据库,很不爽。
<% content_for :title do %>
<title><%=@page.title %></title>
<% end %>
<% cache [:resource, @page.id.to_s] do %>
有什么办法吗?
<% content_for :title do %>
<% cache [:resource, @page.id, :title] do %>
<title><%=@page.title %></title>
<% end %>
<% end %>
但是在 cache key 的地方已经读了一次 @page
了,缓存一个 title 意义不大。并且@page.id
做 key 没有利用到 digest key。
<% content_for :title do %>
<% cache [:resource, params[:id], :title] do %>
<title><%=@page.simple_title %></title>
<% end %>
<% end %>
<% cache [:resource, params[:id]] do %>
<table class="table table-striped">
但是,每次刷新页面,依然需要读取数据库。
我明白了,楼主的意思难道是希望做完全静态化。 这样的话,你要把页面 cache 下来,存为 HTML 文件,放在 nginx 可以访问到的路径下。 不过,除非非常大规模的应用,否则没必要完全不读数据库的全静态化。大规模应用的话,这一步也不应该自己来做,而是交给 CDN 做,只要设定哪些页面由 CDN 静态化缓存即可。
expire_fragment(%r{resource/[/s/S]*?})
我现在的 cache 失效策略,是在出现更新的时候,很粗暴的一次性干掉所有 cache。 当然,也可以很精细的逐条处理,不过 cache 失效对于我的项目来说,是个小概率事件。 而且,我很讨厌处理那些由于失效策略失败所引发的问题,很难定位。