класс 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 91
def decrement(name, amount = 1, options = nil)
synchronize do
options = merged_options(options)
if num = read(name, options)
num = num.to_i - amount
write(name, num, options)
num
else
nil
end
end
end Уменьшает целочисленное значение в кэше.
# File activesupport/lib/active_support/cache/memory_store.rb, line 104
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)
synchronize do
options = merged_options(options)
if num = read(name, options)
num = num.to_i + amount
write(name, num, options)
num
else
nil
end
end
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, если кэш в настоящее время очищается.
Защищённые методы экземпляра
# File activesupport/lib/active_support/cache/memory_store.rb, line 129 def cached_size(key, entry) key.to_s.bytesize + entry.size + PER_ENTRY_OVERHEAD end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.