我正在通过 Memcached 在我的 Rails 项目中实现缓存,特别是尝试缓存侧列块(最近的照片、博客等),目前我让它们每 15 分钟左右使缓存过期。哪个行得通,但是如果我可以做到更新,例如添加,更新或诸如此类的新内容,那会更好。
我在 Memcached http://content.newrelic.com/railslab/videos/08-ScalingRails-Memcached-fixed.mp4上观看了 Scaling Rails 截屏视频,在视频中的 8:27,Gregg Pollack 谈到了智能在 Memcached 中缓存的方式是使用智能键(在此示例中为 updated_at 时间戳)来替换以前缓存的项目,而不必使缓存过期。因此,每当更新时间戳时,缓存都会在寻找新时间戳时刷新,我想。
我在这个例子中使用了我的“最近的照片”侧边栏,这就是它的设置方式......
_side-column.html.erb:
<div id="photos"">
<p class="header">Photos</p>
<%= render :partial => 'shared/photos', :collection => @recent_photos %>
</div>
_photos.html.erb
<% cache(photos) do %>
<div class="row">
<%= image_tag photos.thumbnail.url(:thumb) %>
<h3><%= link_to photos.title, photos %></h3>
<p><%= photos.photos_count %> Photos</p>
</div>
</div>
<% 结束 %>
在第一次运行时,Memcached 将块缓存为 views/photos/1-20110308040600 并在页面刷新时重新加载缓存的片段,到目前为止一切都很好。然后我在后端的特定行中添加了一张额外的照片并重新加载,但照片数量没有更新。日志显示它仍在从 views/photos/1-20110308040600 加载,并且没有获取更新的时间戳。我所做的一切似乎与视频所做的相同,我在上面做错了什么?
此外,这个问题还有第二部分。正如您在上面的部分中看到的,为集合调用了@recent_photos 查询(在我的 lib 文件夹中的模块之外)。但是,我注意到即使块被缓存,这个 SELECT 查询仍然被调用。我最初尝试将整个部分包装在一个块中,因为 <% cache(@recent_photos) do %>,但显然这不起作用 - 特别是因为整个集合上没有真正的时间戳,当然它只是个别项目. 如果结果已经被缓存,如何防止进行此查询?
更新 参考第二个问题,我发现除非 Rails.cache.exist? 可能只是我的票,但棘手的是使用时间戳的通配符性质......
更新 2 完全忽略我的第一个问题,我弄清楚了为什么缓存没有刷新。那是因为 updated_at 字段没有被更新。原因是我在父项中添加/删除作为嵌套资源的项目,我可能需要对其实施“触摸”以更新父项中的 updated_at 字段。
但是我的第二个问题仍然存在......即使片段被缓存,主要的@recent_photos 查询仍然被调用......有没有使用cache.exists的方法?定位一个名为 /views/photos/1-2011random 之类的缓存?