我们假设我有一个这样的方法:
def foo
Rails.cache.fetch("cache_key", :expires_in => 60.minutes) do
return_something
end
end
return_something有时会返回一个nil值.发生这种情况时,我不希望将nil值缓存60分钟.相反,下次我调用foo时,我希望传递给fetch的块再次执行.
Rails.cache.fetch默认是这样工作的吗?或者我必须实现此功能吗?
更新(带答案)
事实证明,答案是否定的,至少在使用Memcached时.
最佳答案 它取决于您正在使用的缓存存储的实现.我会说它不应该缓存nil值,但空字符串可以缓存.
看看dalli store implementation即:
def fetch(name, options=nil)
options ||= {}
name = expanded_key name
if block_given?
unless options[:force]
entry = instrument(:read, name, options) do |payload|
payload[:super_operation] = :fetch if payload
read_entry(name, options)
end
end
if !entry.nil?
instrument(:fetch_hit, name, options) { |payload| }
entry
else
result = instrument(:generate, name, options) do |payload|
yield
end
write(name, result, options)
result
end
else
read(name, options)
end
end