使机架缓存中的单个密钥失效?
Invalidating individual keys from rack-cache?
假设我的 rails 应用程序中的一条路径卡在了机架缓存中。有没有办法说:“/games/zelda”应该是来自机架缓存的 removed/invalidated?
您可以从 Memcached 实例中删除一个键或所有键。不幸的是不允许列出所有键。因此,您不能遍历所有键,只删除要使其失效的键。
也就是说我看到了两个选项:
- 删除 Memcached 中的所有键。
- 或者更改 Memcached Storage 配置的 URI 中的路径并重新缓存所有密钥。
假设
- 您的 rails 应用名为
MyApp
- 您要清除的完整 url 是 http://www.myapp.com/games/zelda
步骤 1 获取规范化密钥
mock_request = Rack::MockRequest.env_for('/games/zelda', {"SERVER_NAME"=>"www.myapp.com"})
key = Rack::Cache::Key.call(Rack::Cache::Request.new(mock_request))
步骤 2 检索存储对象
metastore_uri = MyApp::Application.config.action_dispatch.rack_cache[:metastore]
entitystore_uri = MyApp::Application.config.action_dispatch.rack_cache[:entitystore]
metastore = Rack::Cache::Storage.instance.resolve_metastore_uri(metastore_uri)
entitystore = Rack::Cache::Storage.instance.resolve_entitystore_uri(entitystore_uri)
步骤 3 检索元数据
stored_meta = metastore.read(key)
步骤 4 清除每种压缩类型的实体存储
stored_meta.each do |sm|
entitystore.purge(sm[1]["X-Content-Digest"])
end
步骤 5 清除 Metastore
metastore.purge(key)
希望对您有所帮助。
假设我的 rails 应用程序中的一条路径卡在了机架缓存中。有没有办法说:“/games/zelda”应该是来自机架缓存的 removed/invalidated?
您可以从 Memcached 实例中删除一个键或所有键。不幸的是不允许列出所有键。因此,您不能遍历所有键,只删除要使其失效的键。
也就是说我看到了两个选项:
- 删除 Memcached 中的所有键。
- 或者更改 Memcached Storage 配置的 URI 中的路径并重新缓存所有密钥。
假设
- 您的 rails 应用名为
MyApp
- 您要清除的完整 url 是 http://www.myapp.com/games/zelda
步骤 1 获取规范化密钥
mock_request = Rack::MockRequest.env_for('/games/zelda', {"SERVER_NAME"=>"www.myapp.com"})
key = Rack::Cache::Key.call(Rack::Cache::Request.new(mock_request))
步骤 2 检索存储对象
metastore_uri = MyApp::Application.config.action_dispatch.rack_cache[:metastore]
entitystore_uri = MyApp::Application.config.action_dispatch.rack_cache[:entitystore]
metastore = Rack::Cache::Storage.instance.resolve_metastore_uri(metastore_uri)
entitystore = Rack::Cache::Storage.instance.resolve_entitystore_uri(entitystore_uri)
步骤 3 检索元数据
stored_meta = metastore.read(key)
步骤 4 清除每种压缩类型的实体存储
stored_meta.each do |sm|
entitystore.purge(sm[1]["X-Content-Digest"])
end
步骤 5 清除 Metastore
metastore.purge(key)
希望对您有所帮助。