Class: RedisRb::DistRedis

Inherits:
Object
  • Object
show all
Defined in:
lib/redis/dist_redis.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(opts = {}) ⇒ DistRedis

Returns a new instance of DistRedis.



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/redis/dist_redis.rb', line 6

def initialize(opts={})
  hosts = []

  db = opts[:db] || nil
  timeout = opts[:timeout] || nil

  raise "No hosts given" unless opts[:hosts]

  opts[:hosts].each do |h|
    host, port = h.split(':')
    hosts << Client.new(:host => host, :port => port, :db => db, :timeout => timeout)
  end

  @ring = HashRing.new hosts
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(sym, *args, &blk) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/redis/dist_redis.rb', line 32

def method_missing(sym, *args, &blk)
  if redis = node_for_key(args.first.to_s)
    redis.send sym, *args, &blk
  else
    super
  end
end

Instance Attribute Details

#ringObject (readonly)

Returns the value of attribute ring.



5
6
7
# File 'lib/redis/dist_redis.rb', line 5

def ring
  @ring
end

Instance Method Details

#add_server(server) ⇒ Object



27
28
29
30
# File 'lib/redis/dist_redis.rb', line 27

def add_server(server)
  server, port = server.split(':')
  @ring.add_node Client.new(:host => server, :port => port)
end

#bgsaveObject



54
55
56
# File 'lib/redis/dist_redis.rb', line 54

def bgsave
  on_each_node :bgsave
end

#delete_cloud!Object



72
73
74
75
76
77
78
# File 'lib/redis/dist_redis.rb', line 72

def delete_cloud!
  @ring.nodes.each do |red|
    red.keys("*").each do |key|
      red.delete key
    end
  end
end

#flush_allObject Also known as: flushall



62
63
64
# File 'lib/redis/dist_redis.rb', line 62

def flush_all
  on_each_node :flush_all
end

#flush_dbObject Also known as: flushdb



67
68
69
# File 'lib/redis/dist_redis.rb', line 67

def flush_db
  on_each_node :flush_db
end

#keys(glob) ⇒ Object



46
47
48
# File 'lib/redis/dist_redis.rb', line 46

def keys(glob)
  node_keys(glob).flatten
end

#keys_by_node(*keyz) ⇒ Object



101
102
103
104
105
106
107
108
109
# File 'lib/redis/dist_redis.rb', line 101

def keys_by_node(*keyz)
  keyz.flatten.inject({}) do |kbn, k|
    node = node_for_key(k)
    next if kbn[node] && kbn[node].include?(k)
    kbn[node] ||= []
    kbn[node] << k
    kbn
  end
end

#mget(*keyz) ⇒ Object



90
91
92
93
94
95
96
97
98
99
# File 'lib/redis/dist_redis.rb', line 90

def mget(*keyz)
  results = {}
  kbn = keys_by_node(keyz)
  kbn.each do |node, node_keyz|
    node.mapped_mget(*node_keyz).each do |k, v|
      results[k] = v
    end
  end
  keyz.flatten.map { |k| results[k] }
end

#msetObject



86
87
88
# File 'lib/redis/dist_redis.rb', line 86

def mset()

end

#node_for_key(key) ⇒ Object



22
23
24
25
# File 'lib/redis/dist_redis.rb', line 22

def node_for_key(key)
  key = $1 if key =~ /\{(.*)?\}/
  @ring.get_node(key)
end

#node_keys(glob) ⇒ Object



40
41
42
43
44
# File 'lib/redis/dist_redis.rb', line 40

def node_keys(glob)
  @ring.nodes.map do |red|
    red.keys(glob)
  end
end

#on_each_node(command, *args) ⇒ Object



80
81
82
83
84
# File 'lib/redis/dist_redis.rb', line 80

def on_each_node(command, *args)
  @ring.nodes.each do |red|
    red.send(command, *args)
  end
end

#quitObject



58
59
60
# File 'lib/redis/dist_redis.rb', line 58

def quit
  on_each_node :quit
end

#saveObject



50
51
52
# File 'lib/redis/dist_redis.rb', line 50

def save
  on_each_node :save
end