класс ActiveSupport::Cache::MemoryStore
Реализация кеша, хранящего всё в памяти в одном процессе. Если у вас запущены несколько процессов Ruby on Rails (например, при использовании Phusion Passenger или кластеризованного режима puma), то это означает, что экземпляры процессов Rails не смогут обмениваться данными кеша друг с другом, и в этом случае этот кеш может быть не самым подходящим.
Этот кеш имеет ограниченный размер, задаваемый параметром :size при инициализации (по умолчанию 32 МБ). Когда размер кеша превышает выделенный лимит, происходит очистка, которая пытается уменьшить кеш до трёх четвертей максимального размера, удаляя наименее недавно используемые записи.
В отличие от других Cache реализаций кеша, MemoryStore по умолчанию не сжимает значения. MemoryStore не так сильно выигрывает от сжатия, как другие Store реализации, так как не отправляет данные по сети. Однако, когда сжатие включено, оно всё ещё несёт полные затраты на сжатие в плане использования ЦП.
MemoryStore является потокобезопасным.
Константы
- PER_ENTRY_OVERHEAD
Публичные методы класса
# File activesupport/lib/active_support/cache/memory_store.rb, line 48
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 62 def self.supports_cache_versioning? true end
Объявляет поддержку версиирования кеша.
Публичные методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 75
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 67
def clear(options = nil)
synchronize do
@data.clear
@cache_size = 0
end
end Удаляет все данные, сохранённые в данном кеше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 117 def decrement(name, amount = 1, options = nil) modify_value(name, -amount, options) end
Уменьшает целое значение в кеше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 122
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 112 def increment(name, amount = 1, options = nil) modify_value(name, amount, options) end
Увеличивает целое значение в кеше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 88
def prune(target_size, max_time = nil)
return if pruning?
@pruning = true
begin
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
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 && Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time > max_time)
end
end
ensure
@pruning = false
end
end Для обеспечения того, чтобы записи помещались в указанный объём памяти, кеш очищается путём удаления наименее недавно обращённых записей.
# File activesupport/lib/active_support/cache/memory_store.rb, line 107 def pruning? @pruning end
Возвращает true, если кеш в данный момент очищается.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.