класс ActiveSupport::Cache::MemoryStore
Реализация кэша, которая хранит всё в памяти в рамках одного процесса. Если у вас несколько процессов Ruby on Rails (как, например, при использовании Phusion Passenger или в кластерном режиме puma), это означает, что экземпляры процессов Rails не смогут обмениваться данными кэша друг с другом, и в таком сценарии этот кэш может быть не самым подходящим.
Этот кэш имеет ограниченный размер, определяемый параметром :size в инициализаторе (по умолчанию 32 Мб). Когда кэш превышает выделенный размер, происходит очистка, которая пытается уменьшить кэш до трёх четвертей максимального размера путём удаления наименее недавно используемых записей.
MemoryStore потокобезопасен.
Константы
- PER_ENTRY_OVERHEAD
Общедоступные методы класса
# File activesupport/lib/active_support/cache/memory_store.rb, line 19
def initialize(options = nil)
options ||= {}
super(options)
@data = {}
@key_access = {}
@max_size = options[:size] || 32.megabytes
@max_prune_time = options[:max_prune_time] || 2
@cache_size = 0
@monitor = Monitor.new
@pruning = false
end Общедоступные методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 41
def cleanup(options = nil)
options = merged_options(options)
instrument(:cleanup, size: @data.size) do
keys = synchronize { @data.keys }
keys.each do |key|
entry = @data[key]
delete_entry(key, options) if entry && entry.expired?
end
end
end Предварительно итерируется по всем сохранённым ключам и удаляет те, срок действия которых истек.
# File activesupport/lib/active_support/cache/memory_store.rb, line 32
def clear(options = nil)
synchronize do
@data.clear
@key_access.clear
@cache_size = 0
end
end Удаляет все данные, сохранённые в данном кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 83 def decrement(name, amount = 1, options = nil) modify_value(name, -amount, options) end
Уменьшает целочисленное значение в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 88
def delete_matched(matcher, options = nil)
options = merged_options(options)
instrument(:delete_matched, matcher.inspect) do
matcher = key_matcher(matcher, options)
keys = synchronize { @data.keys }
keys.each do |key|
delete_entry(key, options) if key.match(matcher)
end
end
end Удаляет записи кэша, если ключ кэша соответствует заданному шаблону.
# File activesupport/lib/active_support/cache/memory_store.rb, line 78 def increment(name, amount = 1, options = nil) modify_value(name, amount, options) end
Увеличивает целочисленное значение в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 54
def prune(target_size, max_time = nil)
return if pruning?
@pruning = true
begin
start_time = Time.now
cleanup
instrument(:prune, target_size, from: @cache_size) do
keys = synchronize { @key_access.keys.sort { |a, b| @key_access[a].to_f <=> @key_access[b].to_f } }
keys.each do |key|
delete_entry(key, options)
return if @cache_size <= target_size || (max_time && Time.now - start_time > max_time)
end
end
ensure
@pruning = false
end
end Для обеспечения того, чтобы записи поместились в указанный объём памяти, кэш очищается путём удаления наименее недавно использованных записей.
# File activesupport/lib/active_support/cache/memory_store.rb, line 73 def pruning? @pruning end
Возвращает true, если кэш в настоящее время очищается.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.