class Dalli::Client

Public Instance Methods

cluster_stats(type=nil) click to toggle source

Returns a Hash representing sum of stats of each server in ring.

# File lib/dalli/extra.rb, line 63
def cluster_stats(type=nil)
  hash = {'cluster_size' => @servers.length, 'active_servers' => 0}
  ignore = ['accepting_conns', 'pointer_size', 'version', 'pid', 'time']
  stats(type).each do |key,val|
    unless val.nil?
      hash['active_servers'] += 1
      val.each do |k,v|
        next if ignore.include?(k)
        if hash.has_key?(k) 
          hash[k] += v.match('\.').nil? ? Integer(v) : Float(v) rescue v
        else
          hash[k] = v.match('\.').nil? ? Integer(v) : Float(v) rescue v
        end
      end
    end
  end
  hash
end
delete_matched(reg_exp) click to toggle source

Returns a Int, representing number of deleted keys

# File lib/dalli/extra.rb, line 57
def delete_matched(reg_exp)
    _keys = keys(reg_exp)
    _keys.map{|k| delete(k)}.reject{|y| !y}.count
end
keys(reg_exp = nil) click to toggle source

Return keys in Array

# File lib/dalli/extra.rb, line 8
def keys(reg_exp = nil)
    keys = []
    regex = (reg_exp.nil?) ? nil : (reg_exp.is_a?(Regexp)) ? reg_exp : Regexp.new(reg_exp)
    @servers.each do |server|
            connection = telnet(server)
            begin 
                   matches = connection.cmd("String" => "stats items").scan(/STAT items:(\d+):number (\d+)/)

                                    slabs = matches.inject([]) { |items, item| items << Hash[*['id','items'].zip(item).flatten]; items }

                                    slabs.each do |slab|
                                            # Below written code is not kept DRY to avoid if-else compariosions on each key
                                            if reg_exp.nil?
                                          connection.cmd("String" => "stats cachedump #{slab['id']} #{slab['items']}").split("\n").each do |line|
                  if /ITEM (.+) \[\d+ b; \d+ s\]/ =~ line
                    keys << $1
                  end                          
                end
              elsif reg_exp.is_a?(Regexp)
                   connection.cmd("String" => "stats cachedump #{slab['id']} #{slab['items']}").split("\n").each do |line|
                  if /ITEM (.+) \[\d+ b; \d+ s\]/ =~ line
                   cache_key = $1
                    keys << cache_key if regex.match(cache_key)
                  end
                end
              else # return keys which have the given string as a substring
                   connection.cmd("String" => "stats cachedump #{slab['id']} #{slab['items']}").split("\n").each do |line|
                  if /ITEM (.+) \[\d+ b; \d+ s\]/ =~ line
                    keys << $1 if $1[reg_exp]
                  end
                end
                   end
           end                 
          rescue Exception => e
      Dalli.logger.error("Failed to get keys because #{e.to_s}")
    ensure
      connection.close() unless connection.nil?
    end
    end
    keys
end
pairs(reg_exp = nil) click to toggle source

Returns the key-value pairs as Array of Arrays

# File lib/dalli/extra.rb, line 51
def pairs(reg_exp =  nil)
    _keys = keys(reg_exp)
    _keys.zip(_keys.map{|k| get(k)})
end

Private Instance Methods

telnet(server) click to toggle source
# File lib/dalli/extra.rb, line 84
def telnet(server)
  (host, port) = server.split(':')
  telnet = nil
  Dalli.logger.info("target memcahced server: #{host}:#{port}")
  begin
    telnet = Net::Telnet::new(
      'Host' => host,
      'Port' => port,
      'Prompt' => /(^END$)/,
      'Timeout' => 3
    )
  rescue Errno::ECONNREFUSED
            Dalli.logger.error("Error: " + $!)
           end
           telnet
end