class 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. Используйте 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 143
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 для настройки сервера кэша.
Время жизни для условий гонки по умолчанию не установлено. Это может быть использовано для предотвращения записи кэша «стадом» при истечении срока действия горячих записей кэша. См. ActiveSupport::Cache::Store#fetch для получения дополнительной информации.
ActiveSupport::Cache::Store::new # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 69 def self.supports_cache_versioning? true end
Объявление поддержки версионирования кэша.
Открытые методы экземпляра
# File activesupport/lib/active_support/cache/redis_cache_store.rb, line 275 def cleanup(options = nil) super end
Удаляет просроченные записи. Обрабатывается собственно механизмом истечения срока действия Redis (наименее часто/наименее недавно используемые), поэтому ручная очистка не поддерживается.
ActiveSupport::Cache::Store#cleanup # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 283
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 256
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 204
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 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 233
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 168
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 177
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 155
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 # File activesupport/lib/active_support/cache/redis_cache_store.rb, line 294
def stats
redis.with { |c| c.info }
end Получить информацию с серверов redis.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.