class 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 73
def initialize(options = nil)
options ||= {}
options[:coder] = DupCoder unless options.key?(:coder) || options.key?(:serializer)
# 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 88 def self.supports_cache_versioning? true end
Объявляет поддержку версиирования кэша.
Публичные методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 101
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 93
def clear(options = nil)
synchronize do
@data.clear
@cache_size = 0
end
end Удаляет все данные, хранящиеся в заданном хранилище кэша.
# File activesupport/lib/active_support/cache/memory_store.rb, line 164 def decrement(name, amount = 1, options = nil) modify_value(name, -amount, options) end
Уменьшает значение кэшированного целого числа. Возвращает обновлённое значение.
Если ключ не задан или истек, ему будет присвоено значение -amount.
cache.decrement("foo") # => -1
Для задания конкретного значения используйте write:
cache.write("baz", 5)
cache.decrement("baz") # => 4
# File activesupport/lib/active_support/cache/memory_store.rb, line 169
def delete_matched(matcher, options = nil)
options = merged_options(options)
matcher = key_matcher(matcher, options)
instrument(:delete_matched, matcher.inspect) do
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 149 def increment(name, amount = 1, options = nil) modify_value(name, amount, options) end
Увеличивает значение кэшированного целого числа. Возвращает обновлённое значение.
Если ключ не задан, ему будет присвоено значение amount:
cache.increment("foo") # => 1
cache.increment("bar", 100) # => 100
Для задания конкретного значения используйте write:
cache.write("baz", 5)
cache.increment("baz") # => 6
# File activesupport/lib/active_support/cache/memory_store.rb, line 114
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 133 def pruning? @pruning end
Возвращает true, если кэш в данный момент очищается.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.