Class: ActiveSupport::Cache::MemCacheStore

Inherits:
Store show all
Defined in:
lib/active_support/cache/mem_cache_store.rb

Overview

A cache store implementation which stores data in Memcached: www.danga.com/memcached/

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 goes back online.

  • Time-based expiry support. See #write and the :expires_in option.

  • Per-request in memory cache for all communication with the MemCache server(s).

Direct Known Subclasses

CompressedMemCacheStore

Defined Under Namespace

Modules: Response

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Store

#fetch, #silence!

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).



36
37
38
39
40
41
42
43
44
# File 'lib/active_support/cache/mem_cache_store.rb', line 36

def initialize(*addresses)
  addresses = addresses.flatten
  options = addresses.extract_options!
  addresses = ["localhost"] if addresses.empty?
  @addresses = addresses
  @data = MemCache.new(addresses, options)

  extend Strategy::LocalCache
end

Instance Attribute Details

#addressesObject (readonly)

Returns the value of attribute addresses.



26
27
28
# File 'lib/active_support/cache/mem_cache_store.rb', line 26

def addresses
  @addresses
end

Instance Method Details

#clearObject



114
115
116
# File 'lib/active_support/cache/mem_cache_store.rb', line 114

def clear
  @data.flush_all
end

#decrement(key, amount = 1) ⇒ Object

:nodoc:



99
100
101
102
103
104
105
# File 'lib/active_support/cache/mem_cache_store.rb', line 99

def decrement(key, amount = 1) # :nodoc:
  log("decrement", key, amount)
  response = @data.decr(key, amount)
  response == Response::NOT_FOUND ? nil : response
rescue MemCache::MemCacheError
  nil
end

#delete(key, options = nil) ⇒ Object

:nodoc:



74
75
76
77
78
79
80
81
# File 'lib/active_support/cache/mem_cache_store.rb', line 74

def delete(key, options = nil) # :nodoc:
  super
  response = @data.delete(key, expires_in(options))
  response == Response::DELETED
rescue MemCache::MemCacheError => e
  logger.error("MemCacheError (#{e}): #{e.message}")
  false
end

#delete_matched(matcher, options = nil) ⇒ Object

:nodoc:



107
108
109
110
111
112
# File 'lib/active_support/cache/mem_cache_store.rb', line 107

def delete_matched(matcher, options = nil) # :nodoc:
  # don't do any local caching at present, just pass
  # through and let the error happen
  super
  raise "Not supported by Memcache"
end

#exist?(key, options = nil) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)


83
84
85
86
87
88
# File 'lib/active_support/cache/mem_cache_store.rb', line 83

def exist?(key, options = nil) # :nodoc:
  # Doesn't call super, cause exist? in memcache is in fact a read
  # But who cares? Reading is very fast anyway
  # Local cache is checked first, if it doesn't know then memcache itself is read from
  !read(key, options).nil?
end

#increment(key, amount = 1) ⇒ Object

:nodoc:



90
91
92
93
94
95
96
97
# File 'lib/active_support/cache/mem_cache_store.rb', line 90

def increment(key, amount = 1) # :nodoc:
  log("incrementing", key, amount)

  response = @data.incr(key, amount)
  response == Response::NOT_FOUND ? nil : response
rescue MemCache::MemCacheError
  nil
end

#read(key, options = nil) ⇒ Object

:nodoc:



46
47
48
49
50
51
52
# File 'lib/active_support/cache/mem_cache_store.rb', line 46

def read(key, options = nil) # :nodoc:
  super
  @data.get(key, raw?(options))
rescue MemCache::MemCacheError => e
  logger.error("MemCacheError (#{e}): #{e.message}")
  nil
end

#statsObject



118
119
120
# File 'lib/active_support/cache/mem_cache_store.rb', line 118

def stats
  @data.stats
end

#write(key, value, options = nil) ⇒ Object

Writes a value to the cache.

Possible options:

  • :unless_exist - set to true if you don’t want to update the cache if the key is already set.

  • :expires_in - the number of seconds that this value may stay in the cache. See ActiveSupport::Cache::Store#write for an example.



61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/active_support/cache/mem_cache_store.rb', line 61

def write(key, value, options = nil)
  super
  method = options && options[:unless_exist] ? :add : :set
  # memcache-client will break the connection if you send it an integer
  # in raw mode, so we convert it to a string to be sure it continues working.
  value = value.to_s if raw?(options)
  response = @data.send(method, key, value, expires_in(options), raw?(options))
  response == Response::STORED
rescue MemCache::MemCacheError => e
  logger.error("MemCacheError (#{e}): #{e.message}")
  false
end