aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/cache
diff options
context:
space:
mode:
authorGabriel Sobrinho <gabriel.sobrinho@gmail.com>2018-02-06 12:16:42 -0200
committerJeremy Daer <jeremydaer@gmail.com>2018-02-23 12:53:01 -0800
commit1077ae96b34b5a1dfbf10ee0c40b1ceb1eb6b30b (patch)
tree49a011bf2eb2f2d302841249178887e317fe06b3 /activesupport/lib/active_support/cache
parent5ecbeda0e225e4961977b5c516088cf12d92319f (diff)
downloadrails-1077ae96b34b5a1dfbf10ee0c40b1ceb1eb6b30b.tar.gz
rails-1077ae96b34b5a1dfbf10ee0c40b1ceb1eb6b30b.tar.bz2
rails-1077ae96b34b5a1dfbf10ee0c40b1ceb1eb6b30b.zip
Caching: MemCache and Redis stores use local cache for multi-reads
Fixes #31909. Closes #31911.
Diffstat (limited to 'activesupport/lib/active_support/cache')
-rw-r--r--activesupport/lib/active_support/cache/strategy/local_cache.rb17
1 files changed, 17 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/cache/strategy/local_cache.rb b/activesupport/lib/active_support/cache/strategy/local_cache.rb
index aaa9638fa8..e17308f83e 100644
--- a/activesupport/lib/active_support/cache/strategy/local_cache.rb
+++ b/activesupport/lib/active_support/cache/strategy/local_cache.rb
@@ -54,6 +54,10 @@ module ActiveSupport
@data[key]
end
+ def read_multi_entries(keys, options)
+ Hash[keys.map { |name| [name, read_entry(name, options)] }.keep_if { |_name, value| value }]
+ end
+
def write_entry(key, value, options)
@data[key] = value
true
@@ -116,6 +120,19 @@ module ActiveSupport
end
end
+ def read_multi_entries(keys, options)
+ return super unless local_cache
+
+ local_entries = local_cache.read_multi_entries(keys, options)
+ missed_keys = keys - local_entries.keys
+
+ if missed_keys.any?
+ local_entries.merge!(super(missed_keys, options))
+ else
+ local_entries
+ end
+ end
+
def write_entry(key, entry, options)
if options[:unless_exist]
local_cache.delete_entry(key, options) if local_cache