Spec-Zone.ru › Ruby on Rails 6.0

класс ActiveSupport::Cache::RedisCacheStore

Родитель:
ActiveSupport::Cache::Store

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

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

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

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

  • Поддерживает фрагментацию по типу Memcached по нескольким Redises с 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

Ключи усекаются с помощью собственного SHA2 хэша, если они превышают 1 КБ

Атрибуты

max_key_bytesize[R]
redis_options[R]

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

new(namespace: nil, compress: true, compress_threshold: 1.kilobyte, 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 180
def initialize(namespace: nil, compress: true, compress_threshold: 1.kilobyte, 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
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 для настройки сервера кэша.

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

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

Указывает поддержку версиирования кэша.

Общедоступные методы экземпляра

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

Реализация API кэша хранилища.

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

Вызывает метод суперкласса ActiveSupport::Cache::Store#cleanup
clear(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 315
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 288
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

Реализация API кэша хранилища.

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

Безопасность: генерирует исключения.

delete_matched(matcher, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 240
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.
      begin
        cursor, keys = c.scan(cursor, match: pattern, count: SCAN_BATCH_SIZE)
        c.del(*keys) unless keys.empty?
      end until cursor == "0"
    end
  end
end

Реализация API кэша хранилища.

Поддерживает шаблоны Redis KEYS с использованием символов подстановки:

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

Реализация API кэша хранилища.

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

Безопасность: генерирует исключения.

inspect() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 204
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 213
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

Реализация API кэша хранилища.

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

Вызывает метод суперкласса ActiveSupport::Cache::Store#read_multi
redis() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 191
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

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

Spec-Zone.ru

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