класс ActiveSupport::Cache::MemoryStore
Реализация кеша, хранящего все данные в памяти в одном процессе. Если вы запускаете несколько процессов Ruby on Rails (например, при использовании mongrel_cluster или Phusion Passenger), это означает, что экземпляры процессов Rails не смогут обмениваться данными кеша друг с другом, и в этом случае данный кеш может быть неподходящим.
Размер этого кеша ограничен, задаваемый параметром :size при инициализации (по умолчанию 32 Мб). Когда кеш превышает заданный размер, происходит очистка, которая пытается сократить кеш до трёх четвертей максимального размера путём удаления наименее недавно используемых записей.
MemoryStore — потокобезопасный.
Константы
- PER_ENTRY_OVERHEAD
Публичные методы класса
# File activesupport/lib/active_support/cache/memory_store.rb, line 19
def initialize(options = nil)
options ||= {}
super(options)
@data = {}
@key_access = {}
@max_size = options[:size] || 32.megabytes
@max_prune_time = options[:max_prune_time] || 2
@cache_size = 0
@monitor = Monitor.new
@pruning = false
end Публичные методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 40
def cleanup(options = nil)
options = merged_options(options)
instrument(:cleanup, :size => @data.size) do
keys = synchronize{ @data.keys }
keys.each do |key|
entry = @data[key]
delete_entry(key, options) if entry && entry.expired?
end
end
end Предварительно итерируется по всем сохранённым ключам и удаляет те, срок действия которых истек.
# File activesupport/lib/active_support/cache/memory_store.rb, line 31
def clear(options = nil)
synchronize do
@data.clear
@key_access.clear
@cache_size = 0
end
end # File activesupport/lib/active_support/cache/memory_store.rb, line 82 def decrement(name, amount = 1, options = nil) modify_value(name, -amount, options) end
Уменьшение целочисленного значения в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 86
def delete_matched(matcher, options = nil)
options = merged_options(options)
instrument(:delete_matched, matcher.inspect) do
matcher = key_matcher(matcher, options)
keys = synchronize { @data.keys }
keys.each do |key|
delete_entry(key, options) if key.match(matcher)
end
end
end # File activesupport/lib/active_support/cache/memory_store.rb, line 77 def increment(name, amount = 1, options = nil) modify_value(name, amount, options) end
Увеличение целочисленного значения в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 53
def prune(target_size, max_time = nil)
return if pruning?
@pruning = true
begin
start_time = Time.now
cleanup
instrument(:prune, target_size, :from => @cache_size) do
keys = synchronize{ @key_access.keys.sort{|a,b| @key_access[a].to_f <=> @key_access[b].to_f} }
keys.each do |key|
delete_entry(key, options)
return if @cache_size <= target_size || (max_time && Time.now - start_time > max_time)
end
end
ensure
@pruning = false
end
end Для обеспечения соответствия записей указанному размеру кеша, прочистка кеша путём удаления наименее недавно используемых записей.
# File activesupport/lib/active_support/cache/memory_store.rb, line 72 def pruning? @pruning end
Возвращает true, если кеш в настоящее время очищается.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.