Spec-Zone.ru › Ruby on Rails 7.1

класс 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

Ключи усекаются с помощью ActiveSupport хэш-функции, если они превышают 1 КБ.

Атрибуты

max_key_bytesize[R]
redis[R]

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

new(error_handler: DEFAULT_ERROR_HANDLER, **redis_options) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 145
def initialize(error_handler: DEFAULT_ERROR_HANDLER, **redis_options)
  universal_options = redis_options.extract!(*UNIVERSAL_OPTIONS)

  if pool_options = self.class.send(:retrieve_pool_options, redis_options)
    @redis = ::ConnectionPool.new(pool_options) { self.class.build_redis(**redis_options) }
  else
    @redis = self.class.build_redis(**redis_options)
  end

  @max_key_bytesize = MAX_KEY_BYTESIZE
  @error_handler = error_handler

  super(universal_options)
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.

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

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

Установив skip_nil: true , не будут кэшироваться результаты nil:

cache.fetch('foo') { nil }
cache.fetch('bar', skip_nil: true) { nil }
cache.exist?('foo') # => true
cache.exist?('bar') # => false
Вызывает метод суперкласса ActiveSupport::Cache::Store::new
supports_cache_versioning?() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 62
def self.supports_cache_versioning?
  true
end

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

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

cleanup(options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 272
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 280
def clear(options = nil)
  failsafe :clear do
    if namespace = merged_options(options)[:namespace]
      delete_matched "*", namespace: namespace
    else
      redis.then { |c| c.flushdb }
    end
  end
end

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

Безопасность: Возбуждает ошибки.

decrement(name, amount = 1, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 258
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)
      change_counter(key, -amount, options)
    end
  end
end

Уменьшает значение кэшированного целого числа с использованием атомарного оператора Redis decrby. Возвращает обновленное значение.

Если ключ не задан или истек, он будет установлен в -amount:

cache.decrement("foo") # => -1

Для установки определенного значения вызовите write передав raw: true:

cache.write("baz", 5, raw: true)
cache.decrement("baz") # => 4

Уменьшение нечислового значения или значения, записанного без raw: true, завершится ошибкой и вернет nil.

Безопасность: Возбуждает ошибки.

delete_matched(matcher, options = nil) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 194
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.then 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:

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 232
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)
      change_counter(key, amount, options)
    end
  end
end

Увеличивает кэшированное целое число с использованием атомарного оператора Redis incrby. Возвращает обновленное значение.

Если ключ не задан или истек, он будет установлен в amount:

cache.increment("foo") # => 1
cache.increment("bar", 100) # => 100

Для установки определенного значения вызовите write передав raw: true:

cache.write("baz", 5, raw: true)
cache.increment("baz") # => 6

Увеличение нечислового значения или значения, записанного без raw: true, завершится ошибкой и вернет nil.

Безопасность: Возбуждает ошибки.

inspect() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 160
def inspect
  "#<#{self.class} options=#{options.inspect} redis=#{redis.inspect}>"
end
read_multi(*names) Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 168
def read_multi(*names)
  return {} if names.empty?

  options = names.extract_options!
  instrument_multi(:read_multi, names, options) do |payload|
    read_multi_entries(names, **options).tap do |results|
      payload[:hits] = results.keys
    end
  end
end

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

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

stats() Показать исходный код
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 291
def stats
  redis.then { |c| c.info }
end

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

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

Spec-Zone.ru

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