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.

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



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

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

Instance Attribute Details

#addressesObject (readonly)

Returns the value of attribute addresses.



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

def addresses
  @addresses
end

Instance Method Details

#clearObject



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

def clear
  @data.flush_all
end

#decrement(key, amount = 1) ⇒ Object

:nodoc:



95
96
97
98
99
100
101
102
# File 'lib/active_support/cache/mem_cache_store.rb', line 95

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:



71
72
73
74
75
76
77
78
# File 'lib/active_support/cache/mem_cache_store.rb', line 71

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:



104
105
106
107
# File 'lib/active_support/cache/mem_cache_store.rb', line 104

def delete_matched(matcher, options = nil) # :nodoc:
  super
  raise "Not supported by Memcache"
end

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

:nodoc:

Returns:

  • (Boolean)


80
81
82
83
84
# File 'lib/active_support/cache/mem_cache_store.rb', line 80

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
  !read(key, options).nil?
end

#increment(key, amount = 1) ⇒ Object

:nodoc:



86
87
88
89
90
91
92
93
# File 'lib/active_support/cache/mem_cache_store.rb', line 86

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:



43
44
45
46
47
48
49
# File 'lib/active_support/cache/mem_cache_store.rb', line 43

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



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

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.



58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/active_support/cache/mem_cache_store.rb', line 58

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