80

Is it possible to somehow run Rails.cache.clear and only clear keys with a certain name/string?

I don't want to clear the entire cache...just keys with the string blog/post in the name (ie. blog/post/1, blog/post/2).

I'm using dalli with memcached for my cache and running Rails 3.0.6.

Shpigford
  • 24,748
  • 58
  • 163
  • 252

4 Answers4

131

This is how you can write to cache -

Rails.cache.write('key', 'value', :time_to_idle => 60.seconds, :timeToLive => 600.seconds)

and in order to delete from cache you can use delete action -

Rails.cache.delete('key')

Delete multiple keys -

Rails.cache.delete_if {|k, v| k =~ 'key' }
Sandip Ransing
  • 7,583
  • 4
  • 37
  • 48
  • Right, but I need to delete all keys that contain a certain string in their name. For instance, all keys that have `blog/post` in the name of the key. – Shpigford Aug 17 '12 at 13:22
  • 1
    @Shpigford `Rails.cache` is just a `hash` ..look for the hash documentation in order to delete multiple keys :) – Sandip Ransing Aug 17 '12 at 14:32
  • 11
    I'm geting an 'undefined method' error for `delete_if`. I'm running Rails 3.0.6. – Shpigford Aug 17 '12 at 15:04
  • Also, forgot to mention, I'm using Dalli w/ memcached as my cache. – Shpigford Aug 17 '12 at 15:08
  • time to idle and time to live seems for EH cache only http://guides.rubyonrails.org/caching_with_rails.html#activesupport-cache-ehcachestore – sites Sep 16 '14 at 21:01
14

To answer my own question...it seems that given I'm using memcached, I actually can't use delete_if or delete_matched because memcached does not support enumerating or querying keys by pattern (1).

Shpigford
  • 24,748
  • 58
  • 163
  • 252
3

You can use the https://github.com/Phobos98/dalli-delete-matched gem that adds a simple implementation of delete_matched method for dalli store with memcached.

fkoessler
  • 6,932
  • 11
  • 60
  • 92
  • Does that work in a multi-server environment? The gem looks like it stores the keys on the cache server without any guards to prevent multiple writers – John Naegle Mar 23 '17 at 19:52
0

I add some dependency in the cache key, for example Rails.cache.fetch("blog_#{blog.posts.order(:id).last.updated_at}_stat"). So this key will expire automatically when any post changed.