класс ActiveSupport::Cache::RedisCacheStore
Хранилище кэша Redis
Примечание при развертывании: Используйте отдельное хранилище Redis для кэша, а не подключайтесь к постоянному серверу Redis (например, используемому в очереди Active Job). 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::Distributed4.0.1+ для поддержки распределённого mget. -
delete_matchedподдержка Redis KEYS-глобов.
Константы
- DEFAULT_ERROR_HANDLER
- DEFAULT_REDIS_OPTIONS
- MAX_KEY_BYTESIZE
-
Ключи усекаются с помощью Active Support digest, если превышают 1 КБ
Атрибуты
Публичные методы класса
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 149
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 может быть экземпляром Redis или блоком, возвращающим экземпляр Redis, или параметр :url может быть строкой или массивом строк, которые будут использованы для создания экземпляра Redis или Redis::Distributed экземпляра.
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 для получения подробностей.
Установка skip_nil: true не будет кэшировать пустые результаты:
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 63 def self.supports_cache_versioning? true end
Объявляет поддержку версиирования кэша.
Методы публичного экземпляра
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 279 def cleanup(options = nil) super end
Удаляет истекшие записи. Обрабатывается в Redis по умолчанию с использованием политики «последнее использование» / «наименьшее использование», поэтому ручная очистка не поддерживается.
ActiveSupport::Cache::Store#cleanup # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 287
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 264
def decrement(name, amount = 1, options = nil)
options = merged_options(options)
key = normalize_key(name, options)
instrument :decrement, key, amount: amount do
failsafe :decrement do
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 198
def delete_matched(matcher, options = nil)
unless String === matcher
raise ArgumentError, "Only Redis glob strings are supported: #{matcher.inspect}"
end
pattern = namespace_key(matcher, options)
instrument :delete_matched, pattern do
redis.then do |c|
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 с использованием символов «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 для получения более подробной информации.
Безопасность: генерирует исключения.
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 237
def increment(name, amount = 1, options = nil)
options = merged_options(options)
key = normalize_key(name, options)
instrument :increment, key, amount: amount do
failsafe :increment do
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 164
def inspect
"#<#{self.class} options=#{options.inspect} redis=#{redis.inspect}>"
end # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 172
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 298
def stats
redis.then { |c| c.info }
end Получение информации от серверов redis.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.