класс ActiveSupport::Cache::RedisCacheStore
Хранилище кэша 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 КБ.
Атрибуты
Публичные методы класса
# 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 # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 62 def self.supports_cache_versioning? true end
Объявляет поддержку версионирования кэша.
Общедоступные методы экземпляра
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 272 def cleanup(options = nil) super end
Удаляет истекшие записи. Обрабатывается непосредственно Redis с истечением срока действия по принципу «менее недавнего использования»/«менее частого использования», поэтому ручная очистка не поддерживается.
ActiveSupport::Cache::Store#cleanup # 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. Безопасно использовать на общих серверах, если кэш имеет именованное пространство.
Безопасность: Возбуждает ошибки.
# 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.
Безопасность: Возбуждает ошибки.
# 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 Поддерживает шаблоны 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 для получения дополнительной информации.
Безопасность: Возбуждает ошибки.
# 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.
Безопасность: Возбуждает ошибки.
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 160
def inspect
"#<#{self.class} options=#{options.inspect} redis=#{redis.inspect}>"
end # 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 Чтение нескольких значений сразу. Возвращает хеш запрошенных ключей -> полученных значений.
# 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.