Spec-Zone.ru › Ruby on Rails 7.1

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

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

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