mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Add expiry support File cache store [#1693 state:resolved] [Roman Shterenzon, Pratik Naik]
This commit is contained in:
parent
9f7eaea201
commit
b5775c2b3e
4 changed files with 33 additions and 7 deletions
|
@ -129,8 +129,8 @@ module ActiveSupport
|
||||||
#
|
#
|
||||||
# For example, MemCacheStore's #write method supports the +:expires_in+
|
# For example, MemCacheStore's #write method supports the +:expires_in+
|
||||||
# option, which tells the memcached server to automatically expire the
|
# option, which tells the memcached server to automatically expire the
|
||||||
# cache item after a certain period. We can use this option with #fetch
|
# cache item after a certain period. This options is also supported by
|
||||||
# too:
|
# FileStore's #read method. We can use this option with #fetch too:
|
||||||
#
|
#
|
||||||
# cache = ActiveSupport::Cache::MemCacheStore.new
|
# cache = ActiveSupport::Cache::MemCacheStore.new
|
||||||
# cache.fetch("foo", :force => true, :expires_in => 5.seconds) do
|
# cache.fetch("foo", :force => true, :expires_in => 5.seconds) do
|
||||||
|
@ -169,6 +169,10 @@ module ActiveSupport
|
||||||
# You may also specify additional options via the +options+ argument.
|
# You may also specify additional options via the +options+ argument.
|
||||||
# The specific cache store implementation will decide what to do with
|
# The specific cache store implementation will decide what to do with
|
||||||
# +options+.
|
# +options+.
|
||||||
|
#
|
||||||
|
# For example, FileStore supports the +:expires_in+ option, which
|
||||||
|
# makes the method return nil for cache items older than the specified
|
||||||
|
# period.
|
||||||
def read(key, options = nil)
|
def read(key, options = nil)
|
||||||
log("read", key, options)
|
log("read", key, options)
|
||||||
end
|
end
|
||||||
|
@ -223,6 +227,10 @@ module ActiveSupport
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
def expires_in(options)
|
||||||
|
(options && options[:expires_in]) || 0
|
||||||
|
end
|
||||||
|
|
||||||
def log(operation, key, options)
|
def log(operation, key, options)
|
||||||
logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}") if logger && !@silence && !@logger_off
|
logger.debug("Cache #{operation}: #{key}#{options ? " (#{options.inspect})" : ""}") if logger && !@silence && !@logger_off
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,11 +10,23 @@ module ActiveSupport
|
||||||
@cache_path = cache_path
|
@cache_path = cache_path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Reads a value from the cache.
|
||||||
|
#
|
||||||
|
# Possible options:
|
||||||
|
# - +:expires_in+ - the number of seconds that this value may stay in
|
||||||
|
# the cache.
|
||||||
def read(name, options = nil)
|
def read(name, options = nil)
|
||||||
super
|
super
|
||||||
File.open(real_file_path(name), 'rb') { |f| Marshal.load(f) } rescue nil
|
|
||||||
|
file_name = real_file_path(name)
|
||||||
|
expires = expires_in(options)
|
||||||
|
|
||||||
|
if File.exist?(file_name) && (expires <= 0 || Time.now - File.mtime(file_name) < expires)
|
||||||
|
File.open(file_name, 'rb') { |f| Marshal.load(f) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Writes a value to the cache.
|
||||||
def write(name, value, options = nil)
|
def write(name, value, options = nil)
|
||||||
super
|
super
|
||||||
ensure_cache_path(File.dirname(real_file_path(name)))
|
ensure_cache_path(File.dirname(real_file_path(name)))
|
||||||
|
|
|
@ -130,10 +130,6 @@ module ActiveSupport
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def expires_in(options)
|
|
||||||
(options && options[:expires_in]) || 0
|
|
||||||
end
|
|
||||||
|
|
||||||
def raw?(options)
|
def raw?(options)
|
||||||
options && options[:raw]
|
options && options[:raw]
|
||||||
end
|
end
|
||||||
|
|
|
@ -146,6 +146,16 @@ class FileStoreTest < ActiveSupport::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
include CacheStoreBehavior
|
include CacheStoreBehavior
|
||||||
|
|
||||||
|
def test_expires_in
|
||||||
|
@cache.write('foo', 'bar')
|
||||||
|
cache_read = lambda { @cache.read('foo', :expires_in => 2) }
|
||||||
|
assert_equal 'bar', cache_read.call
|
||||||
|
sleep(1)
|
||||||
|
assert_equal 'bar', cache_read.call
|
||||||
|
sleep(1)
|
||||||
|
assert_nil cache_read.call
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
class MemoryStoreTest < ActiveSupport::TestCase
|
class MemoryStoreTest < ActiveSupport::TestCase
|
||||||
|
|
Loading…
Reference in a new issue