]> git.saurik.com Git - redis.git/blob - client-libraries/ruby/lib/dist_redis.rb
fix for ZADD in score update mode
[redis.git] / client-libraries / ruby / lib / dist_redis.rb
1 require 'redis'
2 require 'hash_ring'
3 class DistRedis
4 attr_reader :ring
5 def initialize(opts={})
6 hosts = []
7
8 db = opts[:db] || nil
9 timeout = opts[:timeout] || nil
10
11 raise Error, "No hosts given" unless opts[:hosts]
12
13 opts[:hosts].each do |h|
14 host, port = h.split(':')
15 hosts << Redis.new(:host => host, :port => port, :db => db, :timeout => timeout)
16 end
17
18 @ring = HashRing.new hosts
19 end
20
21 def node_for_key(key)
22 key = $1 if key =~ /\{(.*)?\}/
23 @ring.get_node(key)
24 end
25
26 def add_server(server)
27 server, port = server.split(':')
28 @ring.add_node Redis.new(:host => server, :port => port)
29 end
30
31 def method_missing(sym, *args, &blk)
32 if redis = node_for_key(args.first.to_s)
33 redis.send sym, *args, &blk
34 else
35 super
36 end
37 end
38
39 def keys(glob)
40 @ring.nodes.map do |red|
41 red.keys(glob)
42 end
43 end
44
45 def save
46 on_each_node :save
47 end
48
49 def bgsave
50 on_each_node :bgsave
51 end
52
53 def quit
54 on_each_node :quit
55 end
56
57 def flush_all
58 on_each_node :flush_all
59 end
60 alias_method :flushall, :flush_all
61
62 def flush_db
63 on_each_node :flush_db
64 end
65 alias_method :flushdb, :flush_db
66
67 def delete_cloud!
68 @ring.nodes.each do |red|
69 red.keys("*").each do |key|
70 red.delete key
71 end
72 end
73 end
74
75 def on_each_node(command, *args)
76 @ring.nodes.each do |red|
77 red.send(command, *args)
78 end
79 end
80
81 end
82
83
84 if __FILE__ == $0
85
86 r = DistRedis.new 'localhost:6379', 'localhost:6380', 'localhost:6381', 'localhost:6382'
87 r['urmom'] = 'urmom'
88 r['urdad'] = 'urdad'
89 r['urmom1'] = 'urmom1'
90 r['urdad1'] = 'urdad1'
91 r['urmom2'] = 'urmom2'
92 r['urdad2'] = 'urdad2'
93 r['urmom3'] = 'urmom3'
94 r['urdad3'] = 'urdad3'
95 p r['urmom']
96 p r['urdad']
97 p r['urmom1']
98 p r['urdad1']
99 p r['urmom2']
100 p r['urdad2']
101 p r['urmom3']
102 p r['urdad3']
103
104 r.push_tail 'listor', 'foo1'
105 r.push_tail 'listor', 'foo2'
106 r.push_tail 'listor', 'foo3'
107 r.push_tail 'listor', 'foo4'
108 r.push_tail 'listor', 'foo5'
109
110 p r.pop_tail('listor')
111 p r.pop_tail('listor')
112 p r.pop_tail('listor')
113 p r.pop_tail('listor')
114 p r.pop_tail('listor')
115
116 puts "key distribution:"
117
118 r.ring.nodes.each do |red|
119 p [red.port, red.keys("*")]
120 end
121 r.delete_cloud!
122 p r.keys('*')
123
124 end