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 166
def decrement(name, amount = 1, options = nil)
instrument(:decrement, name, amount: amount) do
modify_value(name, -amount, options)
end
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 173
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)
instrument(:increment, name, amount: amount) do
modify_value(name, amount, options)
end
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.