Class: Dallish::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/dallish/client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params) ⇒ Client

Returns a new instance of Client.

Raises:

  • (ArgumentError)


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/dallish/client.rb', line 12

def initialize(params)
  raise ArgumentError.new('`params` should be a Hash value.') unless params.is_a? Hash

  # log settings
  @log = Logger.new(params[:log_output] || STDOUT)
  @log.level = params[:log_level] || Logger::INFO

  # memcached server settings
  if params[:servers] and params[:servers].is_a?(String)
    @servers = [params[:servers]]
  else
    @servers = params[:servers] || ['127.0.0.1:11211']
  end
  @dalli_options = params[:options] || {}
  @dalli = Dalli::Client.new(@servers, @dalli_options)

  # cannot support memcached 1.6 or higher
  self.servers.each { |server|
    version = telnet(server, :prompt => /\n/).cmd('version')
    self.log.debug "version: #{version}"

    /VERSION (?<major_version>\d+\.\d+).*/ =~ version
    if major_version and major_version.to_f >= 1.6
      raise ArgumentError.new("Sorry, Dallish doesn't support memcached 1.6 or higher version.")
    end
  }
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args, &block) ⇒ Object



96
97
98
# File 'lib/dallish/client.rb', line 96

def method_missing(name, *args, &block)
  self.dalli.send(name, *args, &block)
end

Instance Attribute Details

#dalliObject

Returns the value of attribute dalli.



10
11
12
# File 'lib/dallish/client.rb', line 10

def dalli
  @dalli
end

#logObject

Returns the value of attribute log.



10
11
12
# File 'lib/dallish/client.rb', line 10

def log
  @log
end

#serversObject

Returns the value of attribute servers.



10
11
12
# File 'lib/dallish/client.rb', line 10

def servers
  @servers
end

Instance Method Details

#all_keysObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/dallish/client.rb', line 51

def all_keys()
  self.servers.flat_map { |server|
    telnet = telnet(server)
    begin
      slab_ids = telnet.cmd("stats slabs").split("\n").map { |line|
        /STAT (?<slab_id>\d+):.+/ =~ line
        slab_id
      }.reject { |e| e.nil? }.uniq

      slab_ids.flat_map { |slab_id|
        telnet.cmd("stats cachedump #{slab_id} 1000000").split("\n").map { |line|
          /ITEM (?<key>.+) \[\d+ b; \d+ s\]/ =~ line
          key
        }
      }
    rescue Exception => e
      self.log.info "Failed to get keys because #{e.to_s}"
      []
    ensure
      telnet.close()
    end
  }.reject { |e| e.nil? }.uniq
end

#delete_all_by(regexp) ⇒ Object



83
84
85
86
87
# File 'lib/dallish/client.rb', line 83

def delete_all_by(regexp)
  find_keys_by(regexp).each do |key|
    self.dalli.delete(key)
  end
end

#find_all_by(regexp) ⇒ Object



89
90
91
92
93
94
# File 'lib/dallish/client.rb', line 89

def find_all_by(regexp)
  find_keys_by(regexp).inject({}) { |result, key|
    result[key] = self.dalli.get(key)
    result
  }
end

#find_keys_by(regexp) ⇒ Object



75
76
77
78
79
80
81
# File 'lib/dallish/client.rb', line 75

def find_keys_by(regexp)
  all_keys.select { |key|
    if key.is_a?(Array) then
      puts "#{key},#{key.class}"
    end
    regexp.match(key) }
end

#telnet(server, options = {}) ⇒ Object



40
41
42
43
44
45
46
47
48
49
# File 'lib/dallish/client.rb', line 40

def telnet(server, options = {})
  (host, port) = server.split(':')
  self.log.debug "target memcahced server: #{host}:#{port}"
  telnet = Net::Telnet::new(
      'Host' => host,
      'Port' => port,
      'Prompt' => options[:prompt] || /(^END$)/,
      'Timeout' => options[:timeout] || 3
  )
end