123456789_123456789_123456789_123456789_123456789_

Class: ActiveSupport::Cache::MemoryStore

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Store
Instance Chain:
self, Store
Inherits: ActiveSupport::Cache::Store
Defined in: activesupport/lib/active_support/cache/memory_store.rb

Overview

A cache store implementation which stores everything into memory in the same process. If you’re running multiple Ruby on ::Rails server processes (which is the case if you’re using Phusion Passenger or puma clustered mode), then this means that ::Rails server process instances won’t be able to share cache data with each other and this may not be the most appropriate cache in that scenario.

This cache has a bounded size specified by the :size options to the initializer (default is 32Mb). When the cache exceeds the allotted size, a cleanup will occur which tries to prune the cache down to three quarters of the maximum size by removing the least recently used entries.

Unlike other ::ActiveSupport::Cache store implementations, MemoryStore does not compress values by default. MemoryStore does not benefit from compression as much as other Store implementations, as it does not send data over a network. However, when compression is enabled, it still pays the full cost of compression in terms of cpu use.

MemoryStore is thread-safe.

Constant Summary

Store - Inherited

DEFAULT_CODER

Class Attribute Summary

Store - Inherited

Class Method Summary

Store - Inherited

.new

Creates a new cache.

Instance Attribute Summary

Store - Inherited

Instance Method Summary

Store - Inherited

#cleanup

Cleanups the cache by removing expired entries.

#clear

Clears the entire cache.

#decrement

Decrements an integer value in the cache.

#delete

Deletes an entry in the cache.

#delete_matched

Deletes all entries with keys matching the pattern.

#delete_multi

Deletes multiple entries in the cache.

#exist?

Returns true if the cache contains an entry for the given key.

#fetch

Fetches data from the cache, using the given key.

#fetch_multi

Fetches data from the cache, using the given keys.

#increment

Increments an integer value in the cache.

#mute

Silences the logger within a block.

#read

Reads data from the cache, using the given key.

#read_multi

Reads multiple values at once from the cache.

#silence,
#silence!

Silences the logger.

#write

Writes the value to the cache, with the key.

#write_multi

::ActiveSupport::Cache Storage API to write multiple values at once.

#key_matcher

Adds the namespace defined in the options to a pattern designed to match keys.

Constructor Details

.new(options = nil) ⇒ MemoryStore

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 44

def initialize(options = nil)
  options ||= {}
  # 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

Class Attribute Details

.supports_cache_versioning?Boolean (readonly)

Advertise cache versioning support.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 58

def self.supports_cache_versioning?
  true
end

Instance Attribute Details

#pruning?Boolean (readonly)

Returns true if the cache is currently being pruned.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 103

def pruning?
  @pruning
end

Instance Method Details

#cleanup(options = nil)

Preemptively iterates through all stored keys and removes the ones which have expired.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 71

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)

Delete all data stored in a given cache store.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 63

def clear(options = nil)
  synchronize do
    @data.clear
    @cache_size = 0
  end
end

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

Decrement an integer value in the cache.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 113

def decrement(name, amount = 1, options = nil)
  modify_value(name, -amount, options)
end

#delete_matched(matcher, options = nil)

Deletes cache entries if the cache key matches a given pattern.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 118

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

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

Increment an integer value in the cache.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 108

def increment(name, amount = 1, options = nil)
  modify_value(name, amount, options)
end

#prune(target_size, max_time = nil)

To ensure entries fit within the specified memory prune the cache by removing the least recently accessed entries.

[ GitHub ]

  
# File 'activesupport/lib/active_support/cache/memory_store.rb', line 84

def prune(target_size, max_time = nil)
  return if pruning?
  @pruning = true
  begin
    start_time = Concurrent.monotonic_time
    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 && Concurrent.monotonic_time - start_time > max_time)
      end
    end
  ensure
    @pruning = false
  end
end