Spec-Zone.ru › Ruby on Rails 7.2

class ActiveSupport::Cache::MemoryStore

Parent:
ActiveSupport::Cache::Store

Хранилище кэша памяти

Реализация хранилища кэша, которое хранит все данные в памяти в одном процессе. Если вы запускаете несколько процессов Ruby on Rails (например, при использовании Phusion Passenger или puma в режиме кластеризации), это означает, что экземпляры процессов Rails не смогут обмениваться данными кэша друг с другом, и в этом случае это может быть не самое подходящее хранилище кэша.

Этот кэш имеет ограниченный размер, заданный параметрами :size в инициализаторе (по умолчанию 32 МБ). Когда кэш превышает выделенный размер, выполняется очистка, которая пытается уменьшить кэш до трёх четвертей максимального размера, удаляя наименее используемые записи.

В отличие от других реализаций хранилищ Cache, MemoryStore по умолчанию не сжимает значения. MemoryStore не так сильно выигрывает от сжатия, как другие реализации Store, так как не отправляет данные по сети. Однако, когда сжатие включено, оно всё равно несёт полную стоимость сжатия в плане использования ЦП.

MemoryStore является потокобезопасным.

Константы

PER_ENTRY_OVERHEAD

Публичные методы класса

new(options = nil) Показать исходный код
# 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
supports_cache_versioning?() Показать исходный код
# File activesupport/lib/active_support/cache/memory_store.rb, line 88
def self.supports_cache_versioning?
  true
end

Объявляет поддержку версиирования кэша.

Публичные методы экземпляра

cleanup(options = nil) Показать исходный код
# 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

Предварительно итерируется по всем сохранённым ключам и удаляет истекшие.

clear(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/memory_store.rb, line 93
def clear(options = nil)
  synchronize do
    @data.clear
    @cache_size = 0
  end
end

Удаляет все данные, хранящиеся в заданном хранилище кэша.

decrement(name, amount = 1, options = nil) Показать исходный код
# 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
delete_matched(matcher, options = nil) Показать исходный код
# 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

Удаляет записи кэша, если ключ кэша соответствует заданному шаблону.

increment(name, amount = 1, options = nil) Показать исходный код
# 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
prune(target_size, max_time = nil) Показать исходный код
# 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

Для обеспечения того, чтобы записи поместились в заданный размер памяти, кэш очищается путём удаления наименее недавно используемых записей.

pruning?() Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API