你如何在Heroku上过期Memcached条目

时间:2011-12-24 06:18:27

标签: ruby-on-rails-3 caching heroku memcached

我在Heroku上使用:expires_in选项在我的Rails 3应用上使用动作缓存。我已经尝试在更新时直接在控制器中调用expire_action,并且在扫描器内。似乎没有任何东西正确地使缓存条目失效。

在我的控制器中:

caches_action :embed, :if => Proc.new { |c| c.request.format.js? || c.request.format.rss? }, :expires_in => 5.minutes

在我的行动中:

expire_action :action => :embed, :format => :js

我还尝试使用网址生成器来获取确切密钥:

expire_action obj_embed_url(@obj.unique_token)

我想知道它是否是Heroku使用Varnish缓存层,你不能过期。 (缓存在5分钟后明确到期,因为我可以看到内容更新。)看来我正确配置了memcached外接程序(使用Dalli gem; config.cache_store =:dalli_store),我可以看到适当的环境变量......

$ heroku config |grep MEM 
MEMCACHE_PASSWORD     => xxxxxxxxxxxxxxxxx
MEMCACHE_SERVERS      => xxx.xxx.northscale.net
MEMCACHE_USERNAME     => appxxxxxx%40heroku.com

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

终于想通了。

Heroku的路径不得与expire create / expire调用匹配。因此,如果您在缓存创建中指定路径,并在expire中专门调用该路径,则它将起作用。我也必须使用" expire_fragment"而不是" expire_action"。这是我的代码:

在您的控制器中:

caches_action :load, :up, :juice, :fresh, :cache_path => :custom_cache_path.to_proc

def custom_cache_path
  path = "#{params[:controller]}/#{params[:action]}"
  path += "/#{params[:id]}" if params[:id]
  path += "/#{params[:sha]}" if params[:sha]
  path
end

在到期方法中:

expire_fragment "serve/up/#{@site.id}"
expire_fragment "serve/fresh/#{@site.secret}"