класс ActiveSupport::Cache::MemoryStore
Реализация кэша, хранящего все данные в памяти одного процесса. Если вы используете несколько процессов Ruby on Rails (например, с Phusion Passenger или puma в кластерном режиме), то процессы Rails не смогут обмениваться данными кэша друг с другом, и этот кэш может быть неподходящим в этой ситуации.
Этот кэш имеет ограниченный размер, задаваемый параметром :size в инициализаторе (по умолчанию 32 МБ). Когда кэш превышает заданный размер, происходит очистка, которая пытается уменьшить кэш до трех четвертей максимального размера, удаляя наименее используемые записи.
В отличие от других Cache реализаций кэша, MemoryStore по умолчанию не сжимает значения. MemoryStore не так сильно выигрывает от сжатия, как другие Store реализации, так как не отправляет данные по сети. Однако, если сжатие включено, оно по-прежнему несёт полную нагрузку по сжатию с точки зрения использования ЦП.
MemoryStore потокобезопасен.
Константы
- DEFAULT_CODER
- PER_ENTRY_OVERHEAD
Публичные методы класса
# File activesupport/lib/active_support/cache/memory_store.rb, line 44
def initialize(options = nil)
options ||= {}
# Disable compression by default.
options[:compress] ||= false
super(options)
@data = {}
@max_size = options[:size] || 32.megabytes
@max_prune_time = options[:max_prune_time] || 2
@cache_size = 0
@monitor = Monitor.new
@pruning = false
end ActiveSupport::Cache::Store::new # File activesupport/lib/active_support/cache/memory_store.rb, line 58 def self.supports_cache_versioning? true end
Объявляет поддержку версионирования кэша.
Публичные методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 71
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 63
def clear(options = nil)
synchronize do
@data.clear
@cache_size = 0
end
end Удаляет все данные, хранящиеся в данном кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 113 def decrement(name, amount = 1, options = nil) modify_value(name, -amount, options) end
Уменьшает целочисленное значение в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 118
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 108 def increment(name, amount = 1, options = nil) modify_value(name, amount, options) end
Увеличивает целочисленное значение в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 84
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 { @data.keys }
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 103 def pruning? @pruning end
Возвращает true, если кэш в данный момент очищается.
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.