0

我正在开发 Rails 应用程序,并使用 Dalli 将缓存与 memcache 集成。我正在使用清扫器处理动作缓存和过期缓存。我的扫地机代码如下所示:

class BoardSweeper < ActionController::Caching::Sweeper
  observe Board

  def after_create(board)
    expire_cache(board)
  end

  def expire_cache(board)
   expire_action :controller => :boards, :action => :show, :id => "#{board.id}-#{board.title.parameterize}"
  end

end

但我想使用正则表达式删除缓存,即我想匹配 url 并删除缓存,就像:

如果我的板显示网址是这样的:

 "boards/1/likes-collection-of-branded-products.text/javascript"
 "boards/1/likes-collection-of-branded-products.text/html"

然后我想使用以下表达式使缓存过期:

 Rails.cache.delete_matched(/boards\/1.*/) 

但根据memcache api doc,它不支持delete_matched方法。

我确信应该有一些基于正则表达式的删除方法。请帮忙。

非常感谢!!

4

2 回答 2

0

afaik memcached 的问题在于没有简单的方法来检索所有密钥。这就是为什么没有像基于正则表达式过期这样的功能。

你可以做什么:

为您的缓存键使用命名约定,并简单地使您知道的所有可能已创建的缓存键过期。

这会通过使尚未创建的密钥过期而产生一些开销。

总的来说,我不建议您使用动作缓存。这些被排除在rails4之外是有充分理由的。

于 2013-03-04T10:11:54.993 回答
0

您可以尝试将Gibson缓存服务器作为您的主缓存存储,由于其内部数据结构,它支持在 O(1) 时间内通过前缀使多个键失效,在您的情况下,这只是一个问题:

Rails.cache.delete_matched "boards/1/"

ActiveSupport 扩展正在开发中,将在大约一周内发布。

于 2014-05-11T14:24:24.880 回答