跳至内容 跳至搜索

内存缓存存储

一个缓存存储实现,它将所有内容存储在同一进程的内存中。如果您运行多个 Ruby on Rails 服务器进程(如果您使用 Phusion Passenger 或 puma 集群模式,就会出现这种情况),那么这意味着 Rails 服务器进程实例将无法相互共享缓存数据,在这种情况下,这可能不是最合适的缓存。

此缓存的大小受初始化程序的 :size 选项限制(默认值为 32Mb)。当缓存超过分配的大小后,将进行清理操作,该操作尝试通过删除最近最少使用(LRU)的条目,将缓存修剪至最大大小的四分之三。

与其他 Cache 存储实现不同,MemoryStore 默认情况下不会压缩值。MemoryStore 从压缩中获得的收益不如其他 Store 实现,因为它不发送数据到网络。但是,当启用压缩时,它仍然需要支付压缩在 CPU 使用方面的全部成本。

MemoryStore 是线程安全的。

方法
C
D
I
N
P
S

常量

PER_ENTRY_OVERHEAD = 240
 

类公有方法

new(options = nil)

# File activesupport/lib/active_support/cache/memory_store.rb, line 73
def initialize(options = nil)
  options ||= {}
  options[:coder] = DupCoder unless options.key?(:coder) || options.key?(:serializer)
  # Disable compression by default.
  options[:compress] ||= false
  super(options)
  @data = {}
  @max_size = options[:size] || 32.megabytes
  @max_prune_time = options[:max_prune_time] || 2
  @cache_size = 0
  @monitor = Monitor.new
  @pruning = false
end

supports_cache_versioning?()

宣传缓存版本支持。

# File activesupport/lib/active_support/cache/memory_store.rb, line 88
def self.supports_cache_versioning?
  true
end

实例公有方法

cleanup(options = nil)

抢先遍历所有存储的键并删除已过期的键。

# File activesupport/lib/active_support/cache/memory_store.rb, line 101
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

clear(options = nil)

删除存储在给定缓存存储中的所有数据。

# File activesupport/lib/active_support/cache/memory_store.rb, line 93
def clear(options = nil)
  synchronize do
    @data.clear
    @cache_size = 0
  end
end

decrement(name, amount = 1, options = nil)

递减缓存的整数值。返回更新后的值。

如果键未设置或已过期,它将被设置为 -amount

cache.decrement("foo") # => -1

要设置特定值,请调用 write

cache.write("baz", 5)
cache.decrement("baz") # => 4
# File activesupport/lib/active_support/cache/memory_store.rb, line 166
def decrement(name, amount = 1, options = nil)
  instrument(:decrement, name, amount: amount) do
    modify_value(name, -amount, options)
  end
end

delete_matched(matcher, options = nil)

如果缓存键与给定模式匹配,则删除缓存条目。

# File activesupport/lib/active_support/cache/memory_store.rb, line 173
def delete_matched(matcher, options = nil)
  options = merged_options(options)
  matcher = key_matcher(matcher, options)

  instrument(:delete_matched, matcher.inspect) do
    keys = synchronize { @data.keys }
    keys.each do |key|
      delete_entry(key, **options) if key.match(matcher)
    end
  end
end

increment(name, amount = 1, options = nil)

递增缓存的整数值。返回更新后的值。

如果键未设置,它将被设置为 amount

cache.increment("foo") # => 1
cache.increment("bar", 100) # => 100

要设置特定值,请调用 write

cache.write("baz", 5)
cache.increment("baz") # => 6
# File activesupport/lib/active_support/cache/memory_store.rb, line 149
def increment(name, amount = 1, options = nil)
  instrument(:increment, name, amount: amount) do
    modify_value(name, amount, options)
  end
end

prune(target_size, max_time = nil)

为了确保条目适合指定的内存,通过删除最近最少访问的条目来修剪缓存。

# File activesupport/lib/active_support/cache/memory_store.rb, line 114
def prune(target_size, max_time = nil)
  return if pruning?
  @pruning = true
  begin
    start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
    cleanup
    instrument(:prune, target_size, from: @cache_size) do
      keys = synchronize { @data.keys }
      keys.each do |key|
        delete_entry(key, **options)
        return if @cache_size <= target_size || (max_time && Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time > max_time)
      end
    end
  ensure
    @pruning = false
  end
end

pruning?()

如果缓存当前正在修剪,则返回 true。

# File activesupport/lib/active_support/cache/memory_store.rb, line 133
def pruning?
  @pruning
end