class ActiveSupport::Cache::MemCacheStore
Магазин кэша Memcached
Реализация магазина кэша, хранящего данные в Memcached: memcached.org
В настоящее время это самый популярный магазин кэша для веб-сайтов в производстве.
Особенности:
-
Кластеризация и балансировка нагрузки. Можно указать несколько серверов memcached, и
MemCacheStoreбудет балансировать нагрузку между всеми доступными серверами. Если сервер выходит из строя, тоMemCacheStoreпроигнорирует его до его повторного запуска.
MemCacheStore реализует стратегию Strategy::LocalCache, которая реализует кэш в оперативной памяти внутри блока.
Константы
- ESCAPE_KEY_CHARS
- KEY_MAX_SIZE
- OVERRIDDEN_OPTIONS
-
Эти параметры представляют поведение, переопределенное этой реализацией, и не должны передаваться клиенту Dalli.
Публичные методы класса
# File activesupport/lib/active_support/cache/mem_cache_store.rb, line 118
def initialize(*addresses)
addresses = addresses.flatten
options = addresses.extract_options!
if options.key?(:cache_nils)
options[:skip_nil] = !options.delete(:cache_nils)
end
super(options)
unless [String, Dalli::Client, NilClass].include?(addresses.first.class)
raise ArgumentError, "First argument must be an empty array, address, or array of addresses."
end
if addresses.first.is_a?(Dalli::Client)
ActiveSupport.deprecator.warn(<<~MSG)
Initializing MemCacheStore with a Dalli::Client is deprecated and will be removed in Rails 7.2.
Use memcached server addresses instead.
MSG
@data = addresses.first
else
@mem_cache_options = options.dup
# The value "compress: false" prevents duplicate compression within Dalli.
@mem_cache_options[:compress] = false
(OVERRIDDEN_OPTIONS - %i(compress)).each { |name| @mem_cache_options.delete(name) }
@data = self.class.build_mem_cache(*(addresses + [@mem_cache_options]))
end
end Создаёт новый объект MemCacheStore с указанными адресами серверов memcached. Каждый адрес — это имя хоста или строка хост-порт в формате «имя_хоста:порт». Например:
ActiveSupport::Cache::MemCacheStore.new("localhost", "server-downstairs.localnetwork:8229")
Если адреса не указаны, но ENV['MEMCACHE_SERVERS'] определён, он будет использован вместо них. В противном случае, MemCacheStore подключится к localhost:11211 (стандартный порт memcached). Передача экземпляра Dalli::Client устарела и будет удалена. Пожалуйста, передавайте адрес вместо него.
ActiveSupport::Cache::Store::new # File activesupport/lib/active_support/cache/mem_cache_store.rb, line 38 def self.supports_cache_versioning? true end
Поддерживает версионирование кэша.
Публичные методы экземпляра
# File activesupport/lib/active_support/cache/mem_cache_store.rb, line 215
def clear(options = nil)
rescue_error_with(nil) { @data.with { |c| c.flush_all } }
end Очищает весь кэш на всех серверах memcached. Этот метод следует использовать с осторожностью, когда используется общий кэш.
# File activesupport/lib/active_support/cache/mem_cache_store.rb, line 204
def decrement(name, amount = 1, options = nil)
options = merged_options(options)
instrument(:decrement, name, amount: amount) do
rescue_error_with nil do
@data.with { |c| c.decr(normalize_key(name, options), amount, options[:expires_in], 0) }
end
end
end Уменьшает значение кэшированного целого числа с помощью атомарного оператора memcached decr. Возвращает обновлённое значение.
Если ключ не задан или истек срок действия, ему будет присвоено значение 0. Memcached не поддерживает отрицательные счётчики.
cache.decrement("foo") # => 0
Чтобы установить определённое значение, вызовите write, передавая raw: true:
cache.write("baz", 5, raw: true)
cache.decrement("baz") # => 4
Попытка уменьшить значение, которое не является числовым, или значение, записанное без raw: true, завершится ошибкой и вернёт nil.
# File activesupport/lib/active_support/cache/mem_cache_store.rb, line 180
def increment(name, amount = 1, options = nil)
options = merged_options(options)
instrument(:increment, name, amount: amount) do
rescue_error_with nil do
@data.with { |c| c.incr(normalize_key(name, options), amount, options[:expires_in], amount) }
end
end
end Увеличивает значение кэшированного целого числа с помощью атомарного оператора memcached incr. Возвращает обновлённое значение.
Если ключ не задан или истек срок действия, ему будет присвоено значение 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/mem_cache_store.rb, line 144
def inspect
instance = @data || @mem_cache_options
"#<#{self.class} options=#{options.inspect} mem_cache=#{instance.inspect}>"
end # File activesupport/lib/active_support/cache/mem_cache_store.rb, line 220
def stats
@data.with { |c| c.stats }
end Получает статистику с серверов memcached.
# File activesupport/lib/active_support/cache/mem_cache_store.rb, line 150
Поведение аналогично ActiveSupport::Cache::Store#write, но поддерживает дополнительные параметры, специфичные для memcached.
Дополнительные параметры
-
raw: true— отправляет значение непосредственно на сервер в виде сырых байтов. Значение должно быть строкой или числом. Вы можете использовать прямые операции memcached, такие какincrementиdecrementтолько с сырыми значениями. -
unless_exist: true— предотвращает перезапись существующей записи в кэше.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.