Class: ActiveSupport::Cache::MemCacheStore
- Defined in:
- lib/active_support/cache/mem_cache_store.rb
Overview
A cache store implementation which stores data in Memcached: memcached.org/
This is currently the most popular cache store for production websites.
Special features:
-
Clustering and load balancing. One can specify multiple memcached servers, and MemCacheStore will load balance between all available servers. If a server goes down, then MemCacheStore will ignore it until it comes back up.
MemCacheStore implements the Strategy::LocalCache strategy which implements an in-memory cache inside of a block.
Defined Under Namespace
Modules: LocalCacheWithRaw, Response
Constant Summary collapse
- ESCAPE_KEY_CHARS =
/[\x00-\x20%\x7F-\xFF]/n
Instance Attribute Summary
Attributes inherited from Store
Class Method Summary collapse
Instance Method Summary collapse
-
#clear(options = nil) ⇒ Object
Clear the entire cache on all memcached servers.
-
#decrement(name, amount = 1, options = nil) ⇒ Object
Decrement a cached value.
-
#increment(name, amount = 1, options = nil) ⇒ Object
Increment a cached value.
-
#initialize(*addresses) ⇒ MemCacheStore
constructor
Creates a new MemCacheStore object, with the given memcached server addresses.
-
#read_multi(*names) ⇒ Object
Reads multiple values from the cache using a single call to the servers for all keys.
-
#stats ⇒ Object
Get the statistics from the memcached servers.
Methods inherited from Store
#cleanup, #delete, #delete_matched, #exist?, #fetch, instrument, instrument=, #mute, #read, #silence!, #write
Constructor Details
#initialize(*addresses) ⇒ MemCacheStore
Creates a new MemCacheStore object, with the given memcached server addresses. Each address is either a host name, or a host-with-port string in the form of “host_name:port”. For example:
ActiveSupport::Cache::MemCacheStore.new("localhost", "server-downstairs.localnetwork:8229")
If no addresses are specified, then MemCacheStore will connect to localhost port 11211 (the default memcached port).
Instead of addresses one can pass in a MemCache-like object. For example:
require 'memcached' # gem install memcached; uses C bindings to libmemcached
ActiveSupport::Cache::MemCacheStore.new(Memcached::Rails.new("localhost:11211"))
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
# File 'lib/active_support/cache/mem_cache_store.rb', line 56 def initialize(*addresses) addresses = addresses.flatten = addresses. super() if addresses.first.respond_to?(:get) @data = addresses.first else = .dup UNIVERSAL_OPTIONS.each{|name| .delete(name)} @data = self.class.build_mem_cache(*(addresses + [])) end extend Strategy::LocalCache extend LocalCacheWithRaw end |
Class Method Details
.build_mem_cache(*addresses) ⇒ Object
36 37 38 39 40 41 |
# File 'lib/active_support/cache/mem_cache_store.rb', line 36 def self.build_mem_cache(*addresses) addresses = addresses.flatten = addresses. addresses = ["localhost:11211"] if addresses.empty? MemCache.new(addresses, ) end |
Instance Method Details
#clear(options = nil) ⇒ Object
Clear the entire cache on all memcached servers. This method should be used with care when shared cache is being used.
118 119 120 |
# File 'lib/active_support/cache/mem_cache_store.rb', line 118 def clear( = nil) @data.flush_all end |
#decrement(name, amount = 1, options = nil) ⇒ Object
Decrement a cached value. This method uses the memcached decr atomic operator and can only be used on values written with the :raw option. Calling it on a value not stored with :raw will initialize that value to zero.
106 107 108 109 110 111 112 113 114 |
# File 'lib/active_support/cache/mem_cache_store.rb', line 106 def decrement(name, amount = 1, = nil) # :nodoc: = () response = instrument(:decrement, name, :amount => amount) do @data.decr(escape_key(namespaced_key(name, )), amount) end response == Response::NOT_FOUND ? nil : response.to_i rescue MemCache::MemCacheError nil end |
#increment(name, amount = 1, options = nil) ⇒ Object
Increment a cached value. This method uses the memcached incr atomic operator and can only be used on values written with the :raw option. Calling it on a value not stored with :raw will initialize that value to zero.
92 93 94 95 96 97 98 99 100 |
# File 'lib/active_support/cache/mem_cache_store.rb', line 92 def increment(name, amount = 1, = nil) # :nodoc: = () response = instrument(:increment, name, :amount => amount) do @data.incr(escape_key(namespaced_key(name, )), amount) end response == Response::NOT_FOUND ? nil : response.to_i rescue MemCache::MemCacheError nil end |
#read_multi(*names) ⇒ Object
Reads multiple values from the cache using a single call to the servers for all keys. Options can be passed in the last argument.
75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/active_support/cache/mem_cache_store.rb', line 75 def read_multi(*names) = names. = () keys_to_names = Hash[names.map{|name| [escape_key(namespaced_key(name, )), name]}] raw_values = @data.get_multi(keys_to_names.keys, :raw => true) values = {} raw_values.each do |key, value| entry = deserialize_entry(value) values[keys_to_names[key]] = entry.value unless entry.expired? end values end |
#stats ⇒ Object
Get the statistics from the memcached servers.
123 124 125 |
# File 'lib/active_support/cache/mem_cache_store.rb', line 123 def stats @data.stats end |