def fetch_multi(*keys)
      options = extract_options!(keys).merge(retain_nils: true)
      results = read_multi(*keys, options)
      missing = {}

      invoke(:fetch_multi, keys) do |_store|
        results.each do |key, value|
          next unless value.nil?

          value = yield(key)
          missing[key] = value
          results[key] = value
        end
      end

      write_multi(missing, options) if missing.any?

      results
    end
def fetch_multi(*keys)
      options = extract_options!(keys).merge(retain_nils: true)
      results = read_multi(*keys, options)
      missing = {}

      invoke(:fetch_multi, keys) do |_store|
        results.each do |key, value|
          next unless value.nil?

          value = yield(key)
          missing[key] = value
          results[key] = value
        end
      end

      write_multi(missing, options) if missing.any?

      results
    end
Fetches multiple keys from the cache using a single call to the server
 and filling in any cache misses. All read and write operations are
 executed atomically.

 @overload fetch_multi(keys)
   Return all values for the given keys, applying the block to the key
   when a value is missing.
   @param [String] One or more keys to fetch

 @example

   cache.fetch_multi('alpha', 'beta') do |key|
     "#{key}-was-missing"
   end

   cache.fetch_multi('a', 'b', expires_in: 60) do |key|
     key * 2
   end