在Rails中手动清除片段缓存

yel*_*ign 21 memcached caching ruby-on-rails-3

我正在使用Memcached和Heroku一起使用Rails 3.1应用程序.我有一个错误,错误的东西显示 - 缓存参数不正确.

我有这个:

<% cache("foo_header_cache_#{@user.id}") do %> 
Run Code Online (Sandbox Code Playgroud)

我删除了碎片缓存并推送到Heroku,坏数据消失了.

然后我改为:

<% cache("foo_header_cache_#{@foo.id}") do %> 
Run Code Online (Sandbox Code Playgroud)

但是,当我更正参数时,从@user到@foo,旧的[不正确]缓存版本再次显示(而不是使用正确的数据刷新).

如何手动使此过期,或以其他方式摆脱显示的这些错误数据?

yel*_*ign 39

我最后通过进入rails控制台并使用命令手动清除整个缓存:

Rails.cache.clear
Run Code Online (Sandbox Code Playgroud)

  • John Kloian的答案允许您使单个片段过期.如果您的站点获得了相当大的流量并依赖于缓存,那么一切都将导致页面加载非常缓慢或超时错误,因为缓存已经变暖. (4认同)

Joh*_*ian 23

从rails控制台:

Rails.cache.delete 'FRAGMENT-NAME'
Run Code Online (Sandbox Code Playgroud)

  • 现在这是正确的答案.被接受者正在使用霰弹枪杀死一只苍蝇. (5认同)

Adi*_*ena 20

这个给你:

<% ActionController::Base.new.expire_fragment("foo_header_cache_#{@user.id}") %>
Run Code Online (Sandbox Code Playgroud)

参考:
- 如何从Rails Observer/Model调用expire_fragment?


Mar*_*rom 9

从控制台:

你可以运行它(即如果你知道id是'1')

ActionController::Base.new.expire_fragment("foo_header_cache_1")
Run Code Online (Sandbox Code Playgroud)

要使用,Rails.cache.delete您需要知道片段名称.在你的情况下,它会

Rails.cache.delete("views/foo_header_cache_1") # Just add 'views/' to the front of the string
Run Code Online (Sandbox Code Playgroud)

如果您有使用对象的基于数组的缓存键,例如:

cache([:foo_header_cache, @user])
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样得到片段名称

ActionController::Base.new.fragment_cache_key([:foo_header_cache, @user])
Run Code Online (Sandbox Code Playgroud)

名称包括来自任何对象的时间idupdated_at时间(到yyyymmddhhmmss).它会像"views/foo_header_cache/users/1-20160901021000"

或者只是使用数组清除它.

ActionController::Base.new.expire_fragment([:foo_header_cache, @user])
Run Code Online (Sandbox Code Playgroud)