Method: MemCache#get_multi

Defined in:
lib/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb

#get_multi(*keys) ⇒ Object

Retrieves multiple values from memcached in parallel, if possible.

The memcached protocol supports the ability to retrieve multiple keys in a single request. Pass in an array of keys to this method and it will:

  1. map the key to the appropriate memcached server

  2. send a single request to each server that has one or more key values

Returns a hash of values.

cache["a"] = 1
cache["b"] = 2
cache.get_multi "a", "b" # => { "a" => 1, "b" => 2 }


264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
# File 'lib/gems/activesupport-2.2.2/lib/active_support/vendor/memcache-client-1.5.1/memcache.rb', line 264

def get_multi(*keys)
  raise MemCacheError, 'No active servers' unless active?

  keys.flatten!
  key_count = keys.length
  cache_keys = {}
  server_keys = Hash.new { |h,k| h[k] = [] }

  # map keys to servers
  keys.each do |key|
    server, cache_key = request_setup key
    cache_keys[cache_key] = key
    server_keys[server] << cache_key
  end

  results = {}

  server_keys.each do |server, keys_for_server|
    keys_for_server = keys_for_server.join ' '
    values = if @multithread then
               threadsafe_cache_get_multi server, keys_for_server
             else
               cache_get_multi server, keys_for_server
             end
    values.each do |key, value|
      results[cache_keys[key]] = Marshal.load value
    end
  end

  return results
rescue TypeError, SocketError, SystemCallError, IOError => err
  handle_error server, err
end