класс 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 75
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 90 def self.supports_cache_versioning? true end
Объявляет о поддержке версионирования кэша.
Общедоступные методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 103
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 95
def clear(options = nil)
synchronize do
@data.clear
@cache_size = 0
end
end Удаляет все данные, хранящиеся в указанном хранилище кэша.
# File activesupport/lib/active_support/cache/memory_store.rb, line 168
def decrement(name, amount = 1, **options)
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 175
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 151
def increment(name, amount = 1, **options)
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 116
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 135 def pruning? @pruning end
Возвращает true, если в данный момент выполняется очистка кэша.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.