Class: ActiveSupport::Cache::LibmemcachedStore
- Inherits:
-
Object
- Object
- ActiveSupport::Cache::LibmemcachedStore
- Defined in:
- lib/active_support/cache/libmemcached_store.rb
Overview
Store using memcached gem as client
Global options can be passed to be applied to each method by default. Supported options are
-
:compress
: if set to true, data will be compress before stored -
:compress_threshold
: specify the threshold at which to compress
value, default is 4K
-
:namespace
: prepend each key with this value for simple namespacing -
:expires_in
: default TTL in seconds for each. Default value is 0, i.e. forever
Specific value can be passed per key with write and fetch command.
Options can also be passed direclty to the memcache client, via the :client
option. For example, if you want to use pipelining, you can use :client => { :no_block => true }
Constant Summary collapse
- DEFAULT_CLIENT_OPTIONS =
{ distribution: :consistent_ketama, binary_protocol: true, default_ttl: 0 }
- ESCAPE_KEY_CHARS =
/[\x00-\x20%\x7F-\xFF]/n
- DEFAULT_COMPRESS_THRESHOLD =
4096
- FLAG_COMPRESSED =
0x2
Instance Attribute Summary collapse
-
#addresses ⇒ Object
readonly
Returns the value of attribute addresses.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#silence ⇒ Object
(also: #silence?)
readonly
Returns the value of attribute silence.
Instance Method Summary collapse
- #clear(options = nil) ⇒ Object
- #decrement(key, amount = 1, options = nil) ⇒ Object
- #delete(key, options = nil) ⇒ Object
- #exist?(key, options = nil) ⇒ Boolean
- #fetch(key, options = nil) ⇒ Object
- #increment(key, amount = 1, options = nil) ⇒ Object
-
#initialize(*addresses) ⇒ LibmemcachedStore
constructor
A new instance of LibmemcachedStore.
-
#mute ⇒ Object
Silence the logger within a block.
- #read(key, options = nil) ⇒ Object
- #read_multi(*names) ⇒ Object
-
#silence! ⇒ Object
Silence the logger.
- #stats ⇒ Object
- #write(key, value, options = nil) ⇒ Object
Constructor Details
#initialize(*addresses) ⇒ LibmemcachedStore
Returns a new instance of LibmemcachedStore.
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 50 def initialize(*addresses) addresses.flatten! = addresses. = .delete(:client) || {} if [:namespace] [:prefix_key] = .delete(:namespace) [:prefix_delimiter] = ':' @namespace_length = [:prefix_key].length + 1 else @namespace_length = 0 end [:default_ttl] = .delete(:expires_in).to_i if [:expires_in] @options = .reverse_merge(compress_threshold: DEFAULT_COMPRESS_THRESHOLD) @addresses = addresses @cache = Memcached.new(@addresses, .reverse_merge(DEFAULT_CLIENT_OPTIONS)) @cache.instance_eval { send(:extend, GetWithFlags) } end |
Instance Attribute Details
#addresses ⇒ Object (readonly)
Returns the value of attribute addresses.
26 27 28 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 26 def addresses @addresses end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
33 34 35 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 33 def @options end |
#silence ⇒ Object (readonly) Also known as: silence?
Returns the value of attribute silence.
33 34 35 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 33 def silence @silence end |
Instance Method Details
#clear(options = nil) ⇒ Object
171 172 173 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 171 def clear( = nil) @cache.flush end |
#decrement(key, amount = 1, options = nil) ⇒ Object
143 144 145 146 147 148 149 150 151 152 153 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 143 def decrement(key, amount = 1, = nil) key = (key) instrument(:decrement, key, amount: amount) do @cache.decr(escape_and_normalize(key), amount) end rescue Memcached::NotFound nil rescue Memcached::Error => e log_error(e) nil end |
#delete(key, options = nil) ⇒ Object
110 111 112 113 114 115 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 110 def delete(key, = nil) key = (key) instrument(:delete, key) do |payload| delete_entry(key, ) end end |
#exist?(key, options = nil) ⇒ Boolean
117 118 119 120 121 122 123 124 125 126 127 128 129 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 117 def exist?(key, = nil) key = (key) instrument(:exist?, key) do |payload| if @cache.respond_to?(:exist) @cache.exist(escape_and_normalize(key)) true else read_entry(key, ) != nil end end rescue Memcached::NotFound false end |
#fetch(key, options = nil) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 69 def fetch(key, = nil) if block_given? key = (key) unless && [:force] entry = instrument(:read, key, ) do |payload| payload[:super_operation] = :fetch if payload read_entry(key, ) end end if entry.nil? result = instrument(:generate, key, ) do |payload| yield end write_entry(key, result, ) result else instrument(:fetch_hit, key, ) { |payload| } entry end else read(key, ) end end |
#increment(key, amount = 1, options = nil) ⇒ Object
131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 131 def increment(key, amount = 1, = nil) key = (key) instrument(:increment, key, amount: amount) do @cache.incr(escape_and_normalize(key), amount) end rescue Memcached::NotFound nil rescue Memcached::Error => e log_error(e) nil end |
#mute ⇒ Object
Silence the logger within a block.
43 44 45 46 47 48 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 43 def mute previous_silence, @silence = defined?(@silence) && @silence, true yield ensure @silence = previous_silence end |
#read(key, options = nil) ⇒ Object
94 95 96 97 98 99 100 101 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 94 def read(key, = nil) key = (key) instrument(:read, key, ) do |payload| entry = read_entry(key, ) payload[:hit] = !!entry if payload entry end end |
#read_multi(*names) ⇒ Object
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 155 def read_multi(*names) names.flatten! = names. return {} if names.empty? mapping = Hash[names.map {|name| [escape_and_normalize((name)), name] }] raw_values, flags = @cache.get(mapping.keys, false, true) values = {} raw_values.each do |key, value| values[mapping[key]] = deserialize(value, [:raw], flags[key]) end values end |
#silence! ⇒ Object
Silence the logger.
37 38 39 40 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 37 def silence! @silence = true self end |
#stats ⇒ Object
175 176 177 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 175 def stats @cache.stats end |
#write(key, value, options = nil) ⇒ Object
103 104 105 106 107 108 |
# File 'lib/active_support/cache/libmemcached_store.rb', line 103 def write(key, value, = nil) key = (key) instrument(:write, key, ) do |payload| write_entry(key, value, ) end end |