Spec-Zone.ru › Ruby on Rails 4.2

класс ActiveSupport::Cache::Store

Родитель:
Объект

Абстрактный класс хранилища кэша. Существуют различные реализации хранилищ кэша, каждая со своими дополнительными функциями. См. классы в модуле ActiveSupport::Cache, например, ActiveSupport::Cache::MemCacheStore. MemCacheStore в настоящее время является самым популярным хранилищем кэша для крупных веб-сайтов в производстве.

Некоторые реализации могут не поддерживать все методы, выходящие за рамки основных методов кэширования fetch, write, read, exist?, и delete.

ActiveSupport::Cache::Store может хранить любые сериализуемые объекты Ruby.

cache = ActiveSupport::Cache::MemoryStore.new

cache.read('city')   # => nil
cache.write('city', "Duckburgh")
cache.read('city')   # => "Duckburgh"

Ключи всегда преобразуются в строки и чувствительны к регистру. Когда объект задан как ключ и у него определён метод cache_key, этот метод будет вызван для определения ключа. В противном случае, будет вызван метод to_param. Массивы и хэши также могут быть использованы в качестве ключей. Элементы будут разделены косыми чертами, а элементы внутри хэша будут отсортированы по ключу, чтобы обеспечить согласованность.

cache.read('city') == cache.read(:city)   # => true

Значения Nil могут быть кэшированы.

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

cache.namespace = -> { @last_mod_time }  # Set the namespace to a variable
@last_mod_time = Time.now  # Invalidate the entire cache by changing namespace

Кэши также могут хранить значения в сжатом формате, чтобы экономить место и сокращать время, затрачиваемое на отправку данных. Поскольку есть накладные расходы, значения должны быть достаточно большими, чтобы оправдать сжатие. Для включения сжатия передайте compress: true в инициализаторе или в качестве параметра к fetch или write. Чтобы указать порог, при котором значения сжимаются, установите параметр :compress_threshold. Пороговое значение по умолчанию составляет 16К.

Атрибуты

options[R]
silence[R]
silence?[R]

Публичные Классовые Методы

instrument() Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 189
def self.instrument
  ActiveSupport::Deprecation.warn "ActiveSupport::Cache.instrument is deprecated and will be removed in Rails 5. Instrumentation is now always on so you can safely stop using it."
  true
end

:устаревшее:

instrument=(boolean) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 183
def self.instrument=(boolean)
  ActiveSupport::Deprecation.warn "ActiveSupport::Cache.instrument= is deprecated and will be removed in Rails 5. Instrumentation is now always on so you can safely stop using it."
  true
end

:устаревшее:

new(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 164
def initialize(options = nil)
  @options = options ? options.dup : {}
end

Создать новый кэш. Параметры будут переданы любым вызовам методов записи, кроме :namespace, который может использоваться для установки глобального пространства имен для кэша.

Методы экземпляра публичного интерфейса

cleanup(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 450
def cleanup(options = nil)
  raise NotImplementedError.new("#{self.class.name} does not support cleanup")
end

Очистить кэш, удалив устаревшие записи.

Параметры передаются в реализацию базового кэша.

Не все реализации могут поддерживать этот метод.

clear(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 460
def clear(options = nil)
  raise NotImplementedError.new("#{self.class.name} does not support clear")
end

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

Хэш параметров передаётся в реализацию базового кэша.

Не все реализации могут поддерживать этот метод.

decrement(name, amount = 1, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 441
def decrement(name, amount = 1, options = nil)
  raise NotImplementedError.new("#{self.class.name} does not support decrement")
end

Уменьшить целое значение в кэше.

Параметры передаются в реализацию базового кэша.

Не все реализации могут поддерживать этот метод.

delete(name, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 398
def delete(name, options = nil)
  options = merged_options(options)

  instrument(:delete, name) do
    delete_entry(namespaced_key(name, options), options)
  end
end

Удаляет запись из кэша. Возвращает true если запись была удалена.

Параметры передаются в реализацию базового кэша.

delete_matched(matcher, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 423
def delete_matched(matcher, options = nil)
  raise NotImplementedError.new("#{self.class.name} does not support delete_matched")
end

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

Параметры передаются в реализацию базового кэша.

Не все реализации могут поддерживать этот метод.

exist?(name, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 409
def exist?(name, options = nil)
  options = merged_options(options)

  instrument(:exist?, name) do
    entry = read_entry(namespaced_key(name, options), options)
    (entry && !entry.expired?) || false
  end
end

Возвращает true если кэш содержит запись для данного ключа.

Параметры передаются в реализацию базового кэша.

fetch(name, options = nil) { |_name| ... } Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 288
def fetch(name, options = nil)
  if block_given?
    options = merged_options(options)
    key = namespaced_key(name, options)

    cached_entry = find_cached_entry(key, name, options) unless options[:force]
    entry = handle_expired_entry(cached_entry, key, options)

    if entry
      get_entry_value(entry, name, options)
    else
      save_block_result_to_cache(name, options) { |_name| yield _name }
    end
  else
    read(name, options)
  end
end

Извлекает данные из кэша, используя заданный ключ. Если в кэше есть данные с заданным ключом, возвращаются эти данные.

Если таких данных в кэше нет (промах кэша), то nil будет возвращено. Однако, если был передан блок, этот блок получит ключ и будет выполнен в случае промаха кэша. Возвращаемое значение блока будет записано в кэш под заданным ключом, и это возвращаемое значение будет возвращено.

cache.write('today', 'Monday')
cache.fetch('today')  # => "Monday"

cache.fetch('city')   # => nil
cache.fetch('city') do
  'Duckburgh'
end
cache.fetch('city')   # => "Duckburgh"

Вы также можете указать дополнительные параметры через аргумент options. Установка force: true принудительно вызовет промах кэша:

cache.write('today', 'Monday')
cache.fetch('today', force: true)  # => nil

Установка :compress сохранит большой набор записей кэша в сжатом формате.

Установка :expires_in задаст время истечения срока действия для записи кэша. Все кэши поддерживают автоматическое истечение срока действия содержимого после указанного количества секунд. Это значение может быть указано в качестве параметра конструктору (в этом случае все записи будут затронуты), или его можно передать в методы fetch или write для изменения только одной записи.

cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 5.minutes)
cache.write(key, value, expires_in: 1.minute) # Set a lower value for one entry

Установка :race_condition_ttl очень полезна в ситуациях, когда запись кэша используется очень часто и находится под высокой нагрузкой. Если кэш истекает, и из-за высокой нагрузки несколько разных процессов попытаются прочитать данные напрямую, а затем все они попытаются записать в кэш. Чтобы избежать этого случая, первый процесс, обнаруживший истекшую запись кэша, увеличит время истечения срока действия кэша на значение, заданное в :race_condition_ttl. Да, этот процесс увеличивает срок жизни устаревшего значения на несколько секунд. Из-за продлённого срока жизни предыдущего кэша другие процессы будут продолжать использовать чуть устаревшие данные немного дольше. Тем временем, этот первый процесс продолжит запись нового значения в кэш. После этого все процессы начнут получать новое значение. Важно, чтобы :race_condition_ttl было небольшим.

Если процесс, воссоздающий запись, завершается ошибкой, запись будет воссоздана через указанное количество секунд. Также обратите внимание, что срок жизни устаревшего кэша продлевается только в случае недавнего истечения срока действия. В противном случае генерируется новое значение, и :race_condition_ttl не играет никакой роли.

# Set all values to expire after one minute.
cache = ActiveSupport::Cache::MemoryStore.new(expires_in: 1.minute)

cache.write('foo', 'original value')
val_1 = nil
val_2 = nil
sleep 60

Thread.new do
  val_1 = cache.fetch('foo', race_condition_ttl: 10) do
    sleep 1
    'new value 1'
  end
end

Thread.new do
  val_2 = cache.fetch('foo', race_condition_ttl: 10) do
    'new value 2'
  end
end

# val_1 => "new value 1"
# val_2 => "original value"
# sleep 10 # First thread extend the life of cache by another 10 seconds
# cache.fetch('foo') => "new value 1"

Другие параметры будут обрабатываться конкретной реализацией хранилища кэша. Внутренне, вызовы fetch считывают запись и вызывают write_entry при промахе кэша. options будет передано в вызовы read и write.

Например, метод write MemCacheStore поддерживает опцию :raw, которая сообщает серверу memcached хранить все значения как строки. Мы также можем использовать эту опцию с fetch:

cache = ActiveSupport::Cache::MemCacheStore.new
cache.fetch("foo", force: true, raw: true) do
  :bar
end
cache.fetch('foo') # => "bar"
fetch_multi(*names) { |name| ... } Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 369
def fetch_multi(*names)
  options = names.extract_options!
  options = merged_options(options)
  results = read_multi(*names, options)

  names.each_with_object({}) do |name, memo|
    memo[name] = results.fetch(name) do
      value = yield name
      write(name, value, options)
      value
    end
  end
end

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

Параметры передаются в реализацию базового кэша.

Возвращает хэш с данными для каждого из имён. Например:

cache.write("bim", "bam")
cache.fetch_multi("bim", "boom") { |key| key * 2 }
# => { "bam" => "bam", "boom" => "boomboom" }
increment(name, amount = 1, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 432
def increment(name, amount = 1, options = nil)
  raise NotImplementedError.new("#{self.class.name} does not support increment")
end

Увеличить целое значение в кэше.

Параметры передаются в реализацию базового кэша.

Не все реализации могут поддерживать этот метод.

mute() { || ... } Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 175
def mute
  previous_silence, @silence = defined?(@silence) && @silence, true
  yield
ensure
  @silence = previous_silence
end

Отключить логирование внутри блока.

read(name, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 311
def read(name, options = nil)
  options = merged_options(options)
  key = namespaced_key(name, options)
  instrument(:read, name, options) do |payload|
    entry = read_entry(key, options)
    if entry
      if entry.expired?
        delete_entry(key, options)
        payload[:hit] = false if payload
        nil
      else
        payload[:hit] = true if payload
        entry.value
      end
    else
      payload[:hit] = false if payload
      nil
    end
  end
end

Извлекает данные из кэша, используя заданный ключ. Если в кэше есть данные с заданным ключом, то возвращаются эти данные. В противном случае возвращается nil.

Параметры передаются в реализацию базового кэша.

read_multi(*names) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 338
def read_multi(*names)
  options = names.extract_options!
  options = merged_options(options)
  results = {}
  names.each do |name|
    key = namespaced_key(name, options)
    entry = read_entry(key, options)
    if entry
      if entry.expired?
        delete_entry(key, options)
      else
        results[name] = entry.value
      end
    end
  end
  results
end

Одновременное чтение нескольких значений из кэша. Параметры можно передать в последнем аргументе.

Некоторые реализации кэша могут оптимизировать этот метод.

Возвращает хэш, сопоставляющий предоставленные имена найденным значениям.

silence!() Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 169
def silence!
  @silence = true
  self
end

Отключить логирование.

write(name, value, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 386
def write(name, value, options = nil)
  options = merged_options(options)

  instrument(:write, name, options) do
    entry = Entry.new(value, options)
    write_entry(namespaced_key(name, options), entry, options)
  end
end

Записывает значение в кэш с указанным ключом.

Параметры передаются в реализацию базового кэша.

Защищённые методы экземпляра

key_matcher(pattern, options) Показать исходный код
# File activesupport/lib/active_support/cache.rb, line 469
def key_matcher(pattern, options)
  prefix = options[:namespace].is_a?(Proc) ? options[:namespace].call : options[:namespace]
  if prefix
    source = pattern.source
    if source.start_with?('^')
      source = source[1, source.length]
    else
      source = ".*#{source[0, source.length]}"
    end
    Regexp.new("^#{Regexp.escape(prefix)}:#{source}", pattern.options)
  else
    pattern
  end
end

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

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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