Rails使用带有Memcache的正则表达式过期操作

时间:2013-03-04 08:37:56

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

我正在使用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 方法。

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

非常感谢!!

2 个答案:

答案 0 :(得分:0)

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

你能做什么:

为缓存密钥使用命名约定,并简单地使您知道的所有缓存密钥到期,这些密钥可能已被创建。

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

总的来说,我不会建议您使用动作缓存。那些被排除在rails4之外的原因很充分。

答案 1 :(得分:0)

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

Rails.cache.delete_matched "boards/1/"

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