Spec-Zone.ru › Ruby on Rails 7.0

class ActiveSupport::Cache::RedisCacheStore

Родительский класс:
ActiveSupport::Cache::Store

Хранилище кэша Redis.

Примечание к развертыванию: используйте *специальное хранилище кэша Redis*, а не указывайте на ваш существующий сервер Redis. Он плохо справится со смешанными шаблонами использования и по умолчанию не будет истекать записи кэша.

Руководство по настройке сервера кэша Redis: redis.io/topics/lru-cache

  • Поддерживает стандартный Redis, hiredis и Redis::Distributed.

  • Поддерживает шардинг, подобный Memcached, по нескольким серверам Redis с помощью Redis::Distributed.

  • Надежное. Если сервер Redis недоступен, исключения не генерируются. Cache выборки — это все пропуски, а записи отбрасываются.

  • Локальный кэш. Быстрый основной кэш в памяти в пределах области действия блока/промежуточного ПО.

  • read_multi и write_multi поддержка для Redis mget/mset. Используйте Redis::Distributed 4.0.1+ для распределенной поддержки mget.

  • delete_matched поддержка для Redis KEYS шаблонов.

Константы

DEFAULT_ERROR_HANDLER
DEFAULT_REDIS_OPTIONS
MAX_KEY_BYTESIZE

Ключи усекаются с помощью дайджеста ActiveSupport, если они превышают 1 КБ

Атрибуты

max_key_bytesize[R]
redis_options[R]

Открытые методы класса

new(namespace: nil, compress: true, compress_threshold: 1.kilobyte, coder: default_coder, expires_in: nil, race_condition_ttl: nil, error_handler: DEFAULT_ERROR_HANDLER, **redis_options) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 143
def initialize(namespace: nil, compress: true, compress_threshold: 1.kilobyte, coder: default_coder, expires_in: nil, race_condition_ttl: nil, error_handler: DEFAULT_ERROR_HANDLER, **redis_options)
  @redis_options = redis_options

  @max_key_bytesize = MAX_KEY_BYTESIZE
  @error_handler = error_handler

  super namespace: namespace,
    compress: compress, compress_threshold: compress_threshold,
    expires_in: expires_in, race_condition_ttl: race_condition_ttl,
    coder: coder
end

Создает новое хранилище кэша Redis.

Обрабатывает четыре параметра: блок :redis, экземпляр :redis, строка одиночного :url и несколько строк :url.

Option  Class       Result
:redis  Proc    ->  options[:redis].call
:redis  Object  ->  options[:redis]
:url    String  ->  Redis.new(url: …)
:url    Array   ->  Redis::Distributed.new([{ url: … }, { url: … }, …])

По умолчанию пространство имен не установлено. Укажите его, если сервер кэша Redis используется совместно с другими приложениями: namespace: 'myapp-cache'.

Сжатие включено по умолчанию с пороговым значением 1 КБ, поэтому значения кэша размером более 1 КБ автоматически сжимаются. Отключите, передав compress: false или измените порог, передав compress_threshold: 4.kilobytes.

Срок действия записей кэша по умолчанию не установлен. Ожидается, что Redis будет настроен с политикой удаления, которая автоматически удаляет наименее часто или недавно используемые ключи, когда он достигает максимального объема памяти. См. redis.io/topics/lru-cache для настройки сервера кэша.

Время жизни для условий гонки по умолчанию не установлено. Это может быть использовано для предотвращения записи кэша «стадом» при истечении срока действия горячих записей кэша. См. ActiveSupport::Cache::Store#fetch для получения дополнительной информации.

Вызывает метод суперкласса ActiveSupport::Cache::Store::new
supports_cache_versioning?() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 69
def self.supports_cache_versioning?
  true
end

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

Открытые методы экземпляра

cleanup(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 275
def cleanup(options = nil)
  super
end

Cache Store реализация API.

Удаляет просроченные записи. Обрабатывается собственно механизмом истечения срока действия Redis (наименее часто/наименее недавно используемые), поэтому ручная очистка не поддерживается.

Вызывает метод суперкласса ActiveSupport::Cache::Store#cleanup
clear(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 283
def clear(options = nil)
  failsafe :clear do
    if namespace = merged_options(options)[:namespace]
      delete_matched "*", namespace: namespace
    else
      redis.with { |c| c.flushdb }
    end
  end
end

Очищает весь кэш на всех серверах Redis. Безопасно использовать на общих серверах, если кэш имеет пространство имен.

Защита от сбоев: генерирует ошибки.

decrement(name, amount = 1, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 256
def decrement(name, amount = 1, options = nil)
  instrument :decrement, name, amount: amount do
    failsafe :decrement do
      options = merged_options(options)
      key = normalize_key(name, options)

      redis.with do |c|
        c.decrby(key, amount).tap do
          write_key_expiry(c, key, options)
        end
      end
    end
  end
end

Cache Store реализация API.

Уменьшает значение кэша. Этот метод использует атомарный оператор Redis decr и может использоваться только для значений, записанных с параметром :raw. Вызов для значения, не сохраненного с :raw, инициализирует это значение нулем.

Защита от сбоев: генерирует ошибки.

delete_matched(matcher, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 204
def delete_matched(matcher, options = nil)
  instrument :delete_matched, matcher do
    unless String === matcher
      raise ArgumentError, "Only Redis glob strings are supported: #{matcher.inspect}"
    end
    redis.with do |c|
      pattern = namespace_key(matcher, options)
      cursor = "0"
      # Fetch keys in batches using SCAN to avoid blocking the Redis server.
      nodes = c.respond_to?(:nodes) ? c.nodes : [c]

      nodes.each do |node|
        begin
          cursor, keys = node.scan(cursor, match: pattern, count: SCAN_BATCH_SIZE)
          node.del(*keys) unless keys.empty?
        end until cursor == "0"
      end
    end
  end
end

Cache Store реализация API.

Поддерживает шаблоны Redis KEYS glob:

h?llo matches hello, hallo and hxllo
h*llo matches hllo and heeeello
h[ae]llo matches hello and hallo, but not hillo
h[^e]llo matches hallo, hbllo, ... but not hello
h[a-b]llo matches hallo and hbllo

Используйте \ для экранирования специальных символов, если вы хотите сопоставить их дословно.

См. redis.io/commands/KEYS для получения дополнительной информации.

Защита от сбоев: генерирует ошибки.

increment(name, amount = 1, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 233
def increment(name, amount = 1, options = nil)
  instrument :increment, name, amount: amount do
    failsafe :increment do
      options = merged_options(options)
      key = normalize_key(name, options)

      redis.with do |c|
        c.incrby(key, amount).tap do
          write_key_expiry(c, key, options)
        end
      end
    end
  end
end

Cache Store реализация API.

Увеличивает значение кэша. Этот метод использует атомарный оператор Redis incr и может использоваться только для значений, записанных с параметром :raw. Вызов для значения, не сохраненного с :raw, инициализирует это значение нулем.

Защита от сбоев: генерирует ошибки.

inspect() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 168
def inspect
  instance = @redis || @redis_options
  "#<#{self.class} options=#{options.inspect} redis=#{instance.inspect}>"
end
read_multi(*names) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 177
def read_multi(*names)
  if mget_capable?
    instrument(:read_multi, names, options) do |payload|
      read_multi_mget(*names).tap do |results|
        payload[:hits] = results.keys
      end
    end
  else
    super
  end
end

Cache Store реализация API.

Считывает несколько значений одновременно. Возвращает хэш запрошенных ключей -> полученных значений.

Вызывает метод суперкласса ActiveSupport::Cache::Store#read_multi
redis() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 155
def redis
  @redis ||= begin
    pool_options = self.class.send(:retrieve_pool_options, redis_options)

    if pool_options.any?
      self.class.send(:ensure_connection_pool_added!)
      ::ConnectionPool.new(pool_options) { self.class.build_redis(**redis_options) }
    else
      self.class.build_redis(**redis_options)
    end
  end
end
stats() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 294
def stats
  redis.with { |c| c.info }
end

Получить информацию с серверов redis.

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

Spec-Zone.ru

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