Spec-Zone.ru › Ruby on Rails 8.0

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

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

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