在Heroku上使用Rails 3.1.1,Dalli& Memcachier。
Production.rb
config.cache_store = :dalli_store
config.action_controller.perform_caching = true
的Gemfile
gem 'memcachier'
gem 'dalli'
控制器#显示
unless fragment_exist?("gift-show--" + @gift.slug)
# Perform complicated database query at 4-5 sec
end
查看
<% cache('gift-show--' + @gift.slug, :expires_in => 3456000) do # 40 days %>
# Create an HTML
<% end %>
加载缓存页面时的日志输出
2012-10-17T03:15:43+00:00 app[web.2]: Started GET "/present/baka-kaka-set" for 23.20.90.66 at 2012-10-17 03:15:43 +0000
2012-10-17T03:15:43+00:00 app[web.2]: Could not find fragment for gift-show--baka-kaka-set # my log comment
2012-10-17T03:15:44+00:00 heroku[router]: GET www.mydomain.com/present/baka-kaka-set dyno=web.2 queue=0 wait=0ms service=195ms status=200 bytes=17167
2012-10-17T03:15:43+00:00 app[web.2]: cache: [GET /present/baka-kaka-set] miss
2012-10-17T03:15:43+00:00 app[web.2]: Processing by GiftsController#show as */*
2012-10-17T03:15:43+00:00 app[web.2]: Parameters: {"id"=>"baka-kaka-set"}
2012-10-17T03:15:43+00:00 app[web.2]: Exist fragment? views/gift-show--baka-kaka-set (1.5ms)
2012-10-17T03:15:43+00:00 app[web.2]: Read fragment views/gift-show--baka-kaka-set (1.5ms)
2012-10-17T03:15:43+00:00 app[web.2]: Write fragment views/gift-show--baka-kaka-set (4.0ms)
每个页面一旦创建就非常静态,因此长期到期时间(40天)。
如果我加载这样的页面似乎写入缓存,我可以通过重新加载页面来验证它是否绕过控制器(正如我所料)并快速传送页面。
我的问题
问题是,如果我几分钟后返回页面,它已经从缓存中删除了! fragment_exist?('gift-show--gift-baka-kaka-set')
返回false(Rails.cache.exist?('views/gift-show--gift-baka-kaka-set')
)
我可以在Memcachier分析中看到密钥数量正在减少。即使我运行一个加载每个页面的脚本(创建片段缓存),Memcachier中的键数也不会以相同的速率增加。
我在Memcachier的内存使用率约为34%,所以我没有接近极限。
我的问题
我做错了吗?我该怎么办呢?
是不是我正在写两个不同的缓存或什么?
日志文件中的最后一行让我感到困惑。似乎即使在读取片段之后,仍然会写一个新的片段?这有点奇怪吗?
更新1 :我意识到我已经注释掉了这一行:
# Set expire header of 30 days for static files
config.static_cache_control = "public, max-age=2592000"
之前。这可能导致了这个问题吗?缓存操作是否被视为“静态资产”?
答案 0 :(得分:0)
原来是Memcachier中的一个错误。 Memcachier的支持得出了这个结论,它与Memcache一起运行良好。 Memcachier将尝试修复该错误。