Class: EventMachine::Hiredis::Client

Inherits:
BaseClient show all
Defined in:
lib/em-hiredis/client.rb

Instance Attribute Summary

Attributes inherited from BaseClient

#db, #host, #password, #port

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseClient

#auth, #close_connection, #configure, #configure_inactivity_check, #connect, #connected?, #initialize, #pending_commands?, #reconnect!, #reconnect_connection, #select

Methods included from EventEmitter

#emit, #listeners, #on, #remove_all_listeners, #remove_listener

Constructor Details

This class inherits a constructor from EventMachine::Hiredis::BaseClient

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class EventMachine::Hiredis::BaseClient

Class Method Details

.connect(host = 'localhost', port = 6379, tls = false) ⇒ Object



5
6
7
# File 'lib/em-hiredis/client.rb', line 5

def self.connect(host = 'localhost', port = 6379, tls = false)
  new(host, port, tls).connect
end

.load_scripts_from(dir) ⇒ Object



9
10
11
12
13
14
15
16
# File 'lib/em-hiredis/client.rb', line 9

def self.load_scripts_from(dir)
  Dir.glob("#{dir}/*.lua").each do |f|
    name = Regexp.new(/([^\/]*)\.lua$/).match(f)[1]
    lua = File.open(f, 'r').read
    EM::Hiredis.logger.debug { "Registering script: #{name}" }
    EM::Hiredis::Client.register_script(name, lua)
  end
end

.register_script(name, lua) ⇒ Object



18
19
20
21
22
23
# File 'lib/em-hiredis/client.rb', line 18

def self.register_script(name, lua)
  sha = Digest::SHA1.hexdigest(lua)
  self.send(:define_method, name.to_sym) { |keys, args=[]|
    eval_script(lua, sha, keys, args)
  }
end

Instance Method Details

#eval_script(lua, lua_sha, keys, args) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/em-hiredis/client.rb', line 33

def eval_script(lua, lua_sha, keys, args)
  df = EM::DefaultDeferrable.new
  method_missing(:evalsha, lua_sha, keys.size, *keys, *args).callback(
    &df.method(:succeed)
  ).errback { |e|
    if e.kind_of?(RedisError) && e.redis_error.message.start_with?("NOSCRIPT")
      self.eval(lua, keys.size, *keys, *args)
        .callback(&df.method(:succeed)).errback(&df.method(:fail))
    else
      df.fail(e)
    end
  }
  df
end

#infoObject



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/em-hiredis/client.rb', line 53

def info
  df = method_missing(:info)
  df.callback { |response|
    info = {}
    response.each_line do |line|
      key, value = line.split(":", 2)
      info[key.to_sym] = value.chomp if value
    end
    df.succeed(info)
  }
  df.callback { |info| yield info } if block_given?
  df
end

#info_commandstats(&blk) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/em-hiredis/client.rb', line 67

def info_commandstats(&blk)
  hash_processor = lambda do |response|
    commands = {}
    response.each_line do |line|
      command, data = line.split(':')
      if data
        c = commands[command.sub('cmdstat_', '').to_sym] = {}
        data.split(',').each do |d|
          k, v = d.split('=')
          c[k.to_sym] = v =~ /\./ ? v.to_f : v.to_i
        end
      end
    end
    blk.call(commands)
  end
  method_missing(:info, 'commandstats', &hash_processor)
end

#monitor(&blk) ⇒ Object



48
49
50
51
# File 'lib/em-hiredis/client.rb', line 48

def monitor(&blk)
  @monitoring = true
  method_missing(:monitor, &blk)
end

#psubscribe(channel) ⇒ Object



102
103
104
# File 'lib/em-hiredis/client.rb', line 102

def psubscribe(channel)
  raise "Use pubsub client"
end

#pubsubObject

Gives access to a richer interface for pubsub subscriptions on a separate redis connection



88
89
90
91
92
# File 'lib/em-hiredis/client.rb', line 88

def pubsub
  @pubsub ||= begin
    PubsubClient.new(@host, @port, @password, @db, @tls).connect
  end
end

#punsubscribe(channel) ⇒ Object



106
107
108
# File 'lib/em-hiredis/client.rb', line 106

def punsubscribe(channel)
  raise "Use pubsub client"
end

#register_script(name, lua) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/em-hiredis/client.rb', line 25

def register_script(name, lua)
  sha = Digest::SHA1.hexdigest(lua)
  singleton = class << self; self end
  singleton.send(:define_method, name.to_sym) { |keys, args=[]|
    eval_script(lua, sha, keys, args)
  }
end

#subscribe(*channels) ⇒ Object



94
95
96
# File 'lib/em-hiredis/client.rb', line 94

def subscribe(*channels)
  raise "Use pubsub client"
end

#unsubscribe(*channels) ⇒ Object



98
99
100
# File 'lib/em-hiredis/client.rb', line 98

def unsubscribe(*channels)
  raise "Use pubsub client"
end