Skip to content

Instantly share code, notes, and snippets.

@relishable
Last active August 29, 2015 13:56
Show Gist options
  • Select an option

  • Save relishable/9176864 to your computer and use it in GitHub Desktop.

Select an option

Save relishable/9176864 to your computer and use it in GitHub Desktop.
dalliでもdelete_matchedが使えるようにする
# fork
# https://github.com/Phobos98/dalli-delete-matched
# rails4環境だとエラー出たので以下のように修正した
ActiveSupport::Cache::DalliStore.class_eval do
MEMCACHED_KEYS = 'memcached_keys'
alias_method :old_write, :write
def write(key, entry, options = nil)
keys = get_memcached_keys
unless keys.include?(key)
keys << key
return false unless old_write(MEMCACHED_KEYS, keys.to_yaml, {})
end
old_write(key, entry, options)
end
alias_method :old_delete, :delete
def delete(key, options = nil)
ret = old_delete(key, options)
return false unless ret
keys = get_memcached_keys
if keys.include?(key)
keys -= [ key ]
old_write(MEMCACHED_KEYS, keys.to_yaml, {})
end
ret
end
def delete_matched(matcher, options = nil)
ret = true
deleted_keys = []
keys = get_memcached_keys
keys.each do |key|
if ret && key.match(matcher)
deleted_keys << key if (ret = old_delete(key, options))
end
end
len = keys.length
keys -= deleted_keys
old_write(MEMCACHED_KEYS, keys.to_yaml, {}) if keys.length < len
ret
end
private
def get_memcached_keys
begin
YAML.load read(MEMCACHED_KEYS)
rescue TypeError
[]
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment