класс ActiveSupport::Cache::RedisCacheStore
Хранилище кэша 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. Для поддержки распределенного mget используйте Redis::Distributed 4.0.1+. -
delete_matchedподдержка Redis KEYS globs.
Константы
- DEFAULT_ERROR_HANDLER
- DEFAULT_REDIS_OPTIONS
- MAX_KEY_BYTESIZE
-
Ключи обрезаются с помощью собственного SHA2 дайджеста, если превышают 1 КБ
Атрибуты
Публичные методы класса
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 172
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 для настройки сервера кэширования.
Значение TTL для ситуаций гонки ресурсов не задано по умолчанию. Это можно использовать для предотвращения «эффекта стада» при записи в кэш, когда горячие кэшированные записи истекают. Смотрите ActiveSupport::Cache::Store#fetch для более подробной информации.
ActiveSupport::Cache::Store::new # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 70 def self.supports_cache_versioning? true end
Указывает поддержку версиирования кэша.
Публичные методы экземпляров
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 304 def cleanup(options = nil) super end
Удаляет устаревшие записи. Обрабатывается непосредственно кешированием Redis, поэтому ручная очистка не поддерживается.
ActiveSupport::Cache::Store#cleanup # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 312
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. Безопасно использовать на общих серверах, если кэш именован.
Безопасность: Возникают ошибки.
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 285
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 Уменьшить значение в кэше. Этот метод использует атомарную операцию Redis decr и может быть использован только для значений, записанных с опцией :raw. Вызов его для значения, не сохраненного с :raw, инициализирует это значение в ноль.
Безопасность: Возникают ошибки.
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 233
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 Поддерживает шаблоны 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 262
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 Увеличить значение в кэше. Этот метод использует атомарную операцию Redis incr и может быть использован только для значений, записанных с опцией :raw. Вызов его для значения, не сохраненного с :raw, инициализирует это значение в ноль.
Безопасность: Возникают ошибки.
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 197
def inspect
instance = @redis || @redis_options
"#<#{self.class} options=#{options.inspect} redis=#{instance.inspect}>"
end # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 206
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 Чтение нескольких значений одновременно. Возвращает хэш запрошенных ключей -> полученных значений.
ActiveSupport::Cache::Store#read_multi # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 184
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–2020 David Heinemeier Hansson
Licensed under the MIT License.