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)
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 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.