Ruby on rails 当memcached中出现命中时,如何获取caches\u操作以设置expires头?

Ruby on rails 当memcached中出现命中时,如何获取caches\u操作以设置expires头?,ruby-on-rails,caching,memcached,Ruby On Rails,Caching,Memcached,我有一个使用缓存的操作 caches_action :my_action, :expires_in=>1.hours 还可以使用设置操作本身中的expires头 def my_action ... expires_in 1.hours send_data(...,:disposition => 'inline',:type => 'image/png',:filename => params[:title]+".png") end 但是,当我从mem

我有一个使用缓存的操作

caches_action :my_action, :expires_in=>1.hours
还可以使用设置操作本身中的expires头

def my_action
   ...
   expires_in 1.hours
   send_data(...,:disposition => 'inline',:type => 'image/png',:filename => params[:title]+".png")
end
但是,当我从memcached命中的结果中查看缓存控制响应头时,我得到以下结果:

Cache-Control: private, max-age=0, must-revalidate
第一轮,即当缓存中没有任何内容时,它是我所期望的,即:

Cache-Control: max-age=3600, private
看起来rails+memcached既没有缓存原始响应头,也没有设置适当的头本身。结果是,客户机每次都向服务器发出请求,即使结果(图像)没有更改。虽然操作在缓存中命中后很快完成,但它仍然会再次发送所有数据,这是我希望避免的


如何获取标题以执行正确的操作,从而使客户端在第一时间不发出请求,或者获得“未修改”响应?

确保您的环境配置为支持缓存。因此,在config/environments/development.rb(或任何地方)中,您应该看到:

config.action_controller.perform_caching = true
此外,私有缓存标记告诉中间缓存服务器不要存储内容。默认情况下,这是安全的。如果要更改此行为,只需按如下方式设置缓存:

expires_in(1.hours, :private => false, :public => true)
如果内容没有更改,要跳过服务器上昂贵的处理,请使用:

if stale?(:etag => @model, :last_modified => @model.updated_at.utc)
  # Expensive stuff in here.
  respond_to do |format|
    ...
  end
end

几天前我也有同样的问题。调试rails似乎没有考虑缓存操作的过期时间

我发现有效的方法是将其放在缓存路径中。例如,没有做什么

caches_action :monthly_sales_by_category, :expires_in => 10.minutes, :cache_path => proc { |c|
    category = c.params[:category]
    {:cat => category}
}
我所做的是

caches_action :monthly_sales_by_category, :cache_path => proc { |c|
    expires_in 10.minutes, :public => false
    category = c.params[:category]
    {:cat => category} 
}

工作起来很有魅力。:)

是的,缓存已设置且工作正常-问题是第二次循环,当memcache中出现命中时,不会设置头。另外,在第二次循环中,由于memcache中的命中,操作不会被调用,所以我猜第三个代码片段不会有任何影响。哦,我明白了。我把你的问题搞错了。这很奇怪。您可以发布日志的相关片段吗?根据本文,Rails可能假设为HTML文档,因此密钥可能与您的请求不匹配。只是一个想法。可能是在这些行上的一些东西好吧-我会尝试在那里放一个.png扩展名,看看它是否有帮助。缓存键应该是正常的,因为它肯定是从缓存中提供内容的-日志似乎表明了这一点,而且无论如何,通过缓存的响应时间要快得多。但是可能它对mime类型感到困惑。今天晚些时候回到服务器时,我们将尝试挖掘一些日志-它们不会说太多,但它们确实显示了来自缓存的请求(而且,当缓存未命中时,响应时间明显会慢一些,因此很容易发现命中与未命中-这是一个非常昂贵的操作).谢谢你,谢谢你,谢谢你深入研究。