]> git.saurik.com Git - redis.git/blobdiff - client-libraries/ruby/lib/dist_redis.rb
some work on ZADD against existing element (score update), still broken...
[redis.git] / client-libraries / ruby / lib / dist_redis.rb
index e79af4728b5ac45fb3c46f3f9eacdc3158624727..d92c956effcaf61cb528fa3aa9d0d66968990c87 100644 (file)
@@ -2,27 +2,32 @@ require 'redis'
 require 'hash_ring'
 class DistRedis
   attr_reader :ring
 require 'hash_ring'
 class DistRedis
   attr_reader :ring
-  def initialize(*servers)
-    srvs = []
-    servers.each do |s|
-      server, port = s.split(':')
-      srvs << Redis.new(:host => server, :port => port)
+  def initialize(opts={})
+    hosts = []
+
+    db = opts[:db] || nil
+    timeout = opts[:timeout] || nil
+
+    raise Error, "No hosts given" unless opts[:hosts]
+
+    opts[:hosts].each do |h|
+      host, port = h.split(':')
+      hosts << Redis.new(:host => host, :port => port, :db => db, :timeout => timeout)
     end
     end
-    @ring = HashRing.new srvs
+
+    @ring = HashRing.new hosts
   end
   end
-  
+
   def node_for_key(key)
   def node_for_key(key)
-    if key =~ /\{(.*)?\}/
-      key = $1
-    end
+    key = $1 if key =~ /\{(.*)?\}/
     @ring.get_node(key)
   end
     @ring.get_node(key)
   end
-  
+
   def add_server(server)
     server, port = server.split(':')
     @ring.add_node Redis.new(:host => server, :port => port)
   end
   def add_server(server)
     server, port = server.split(':')
     @ring.add_node Redis.new(:host => server, :port => port)
   end
-  
+
   def method_missing(sym, *args, &blk)
     if redis = node_for_key(args.first.to_s)
       redis.send sym, *args, &blk
   def method_missing(sym, *args, &blk)
     if redis = node_for_key(args.first.to_s)
       redis.send sym, *args, &blk
@@ -30,41 +35,49 @@ class DistRedis
       super
     end
   end
       super
     end
   end
-  
+
   def keys(glob)
   def keys(glob)
-    keyz = []
-    @ring.nodes.each do |red|
-      keyz.concat red.keys(glob)
+    @ring.nodes.map do |red|
+      red.keys(glob)
     end
     end
-    keyz
   end
   end
-  
+
   def save
   def save
-    @ring.nodes.each do |red|
-      red.save
-    end
+    on_each_node :save
   end
   end
-  
+
   def bgsave
   def bgsave
-    @ring.nodes.each do |red|
-      red.bgsave
-    end
+    on_each_node :bgsave
   end
   end
-  
+
   def quit
   def quit
-    @ring.nodes.each do |red|
-      red.quit
-    end
+    on_each_node :quit
+  end
+
+  def flush_all
+    on_each_node :flush_all
   end
   end
-  
+  alias_method :flushall, :flush_all
+
+  def flush_db
+    on_each_node :flush_db
+  end
+  alias_method :flushdb, :flush_db
+
   def delete_cloud!
     @ring.nodes.each do |red|
       red.keys("*").each do |key|
         red.delete key
   def delete_cloud!
     @ring.nodes.each do |red|
       red.keys("*").each do |key|
         red.delete key
-      end  
+      end
+    end
+  end
+
+  def on_each_node(command, *args)
+    @ring.nodes.each do |red|
+      red.send(command, *args)
     end
   end
     end
   end
-  
+
 end
 
 
 end
 
 
@@ -87,21 +100,21 @@ r = DistRedis.new 'localhost:6379', 'localhost:6380', 'localhost:6381', 'localho
   p r['urdad2']
   p r['urmom3']
   p r['urdad3']
   p r['urdad2']
   p r['urmom3']
   p r['urdad3']
-  
+
   r.push_tail 'listor', 'foo1'
   r.push_tail 'listor', 'foo2'
   r.push_tail 'listor', 'foo3'
   r.push_tail 'listor', 'foo4'
   r.push_tail 'listor', 'foo5'
   r.push_tail 'listor', 'foo1'
   r.push_tail 'listor', 'foo2'
   r.push_tail 'listor', 'foo3'
   r.push_tail 'listor', 'foo4'
   r.push_tail 'listor', 'foo5'
-  
+
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
   p r.pop_tail('listor')
-  
+
   puts "key distribution:"
   puts "key distribution:"
-  
+
   r.ring.nodes.each do |red|
     p [red.port, red.keys("*")]
   end
   r.ring.nodes.each do |red|
     p [red.port, red.keys("*")]
   end