I have a rails application, in that I am using simple rails cache. My testing is as follows:
Rails.cache.write(\'temp\',Date.today,:expires_in => 60.seconds)
The :expires_in
option only works with compatible stores (eg memcached) - not memory.
From http://guides.rubyonrails.org/caching_with_rails.html:
Finally, if you are using memcached or Ehcache, you can also pass :expires_in. In fact, all parameters not used by caches_action are sent to the underlying cache store.
After some search, I have found one possible reason why the cache is not cleaned after 60 seconds.
Rails.cache.write
which is documented here.write_entry(namespaced_key(name, options), entry, options)
, where your option :expires_in
is one part of the options
argument.The implementation of write_entry has the following condition:
if expires_in > 0 && !options[:raw]
# Set the memcache expire a few minutes in the future to support race condition ttls on read
expires_in += 5.minutes
end
So there are 5 minutes added to your 60 seconds. 2 possible solutions:
:raw => true
, perhaps this will skip the condition, so that your expiry works as suspected.You should use fetch method with do block instead of Rails.cache.write. Even though the name is "fetch", it writes to the cache if you put inside do block. You also do not need to clear cache entry manually, just use the "fetch" with expires_in and race_condition_ttl. Keep the ttl value under expiry time and keep it as small as possible.
output_json = Rails.cache.fetch('temp',expires_in: 1.minute,race_condition_ttl:3) do
my_expansive_operation().to_json
end