класс 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 Возвращает true, если кэш в данный момент очищается.
# File activesupport/lib/active_support/cache/memory_store.rb, line 72 def pruning? @pruning end
Защищенные методы экземпляра
# 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–2016 David Heinemeier Hansson
Licensed under the MIT License.