класс 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 21
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 34 def self.supports_cache_versioning? true end
Объявляет поддержку версиирования кэша.
Открытые методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 48
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 39
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 90 def decrement(name, amount = 1, options = nil) modify_value(name, -amount, options) end
Уменьшает целое значение в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 95
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 85 def increment(name, amount = 1, options = nil) modify_value(name, amount, options) end
Увеличивает целое значение в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 61
def prune(target_size, max_time = nil)
return if pruning?
@pruning = true
begin
start_time = Concurrent.monotonic_time
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 && Concurrent.monotonic_time - start_time > max_time)
end
end
ensure
@pruning = false
end
end Для обеспечения соответствия записей заданному размеру кэш очищается путем удаления наименее недавно использованных записей.
# File activesupport/lib/active_support/cache/memory_store.rb, line 80 def pruning? @pruning end
Возвращает true, если кэш в настоящее время очищается.
© 2004–2019 David Heinemeier Hansson
Licensed under the MIT License.