Class: TyrantClient
- Inherits:
-
Object
- Object
- TyrantClient
- Defined in:
- lib/tyrant_client.rb
Overview
Tyrant Client
Manages many tyrant clients and exposes basic get/set/delete functionality for them.
Direct Known Subclasses
Constant Summary collapse
- @@connections =
{}
Instance Method Summary collapse
- #delete(key) ⇒ Object
-
#get(key) ⇒ Object
– Get/Set/Delete ++.
- #get_connection(host, port) ⇒ Object
-
#get_db(key) ⇒ Object
– Helpers ++.
- #hash(key) ⇒ Object
-
#initialize(servers) ⇒ TyrantClient
constructor
Initializes a TyrantClient.
- #set(key, value) ⇒ Object
Constructor Details
#initialize(servers) ⇒ TyrantClient
Initializes a TyrantClient. servers is expected to be an array of servers in form of “host:port”
24 25 26 27 28 29 |
# File 'lib/tyrant_client.rb', line 24 def initialize(servers) @servers = servers.collect do |server| parts = server.split(':') [parts[0], parts[1].to_i] end end |
Instance Method Details
#delete(key) ⇒ Object
47 48 49 50 51 52 53 54 55 56 |
# File 'lib/tyrant_client.rb', line 47 def delete(key) db = self.get_db(key) begin db.delete(key) return true rescue return false end end |
#get(key) ⇒ Object
– Get/Set/Delete ++
34 35 36 37 38 |
# File 'lib/tyrant_client.rb', line 34 def get(key) db = self.get_db(key) db[key] end |
#get_connection(host, port) ⇒ Object
80 81 82 83 84 85 86 87 |
# File 'lib/tyrant_client.rb', line 80 def get_connection(host, port) key = "#{host}#{port}" return @@connections[key] unless @@connections[key].nil? @@connections[key] = Rufus::Tokyo::Tyrant.new(host, port) return @@connections[key] end |
#get_db(key) ⇒ Object
– Helpers ++
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/tyrant_client.rb', line 61 def get_db(key) index = self.hash(key) % @servers.length first_host, first_port = @servers[index] begin return self.get_connection(first_host, first_port) rescue # Didn't work, try out other servers @servers.each do |server| host, port = server # The python code "continues" on error code 61. Not sure # what that is so I'll ignore it here but TODO to go back # and look at it return self.get_connection(host, port) end end end |
#hash(key) ⇒ Object
89 90 91 92 93 94 95 96 97 98 |
# File 'lib/tyrant_client.rb', line 89 def hash(key) m = Digest::MD5.new m.update(key) b_key = m.digest return ((b_key[7] << 24) | (b_key[6] << 16) | (b_key[5] << 8) | (b_key[4])) end |
#set(key, value) ⇒ Object
40 41 42 43 44 45 |
# File 'lib/tyrant_client.rb', line 40 def set(key, value) db = self.get_db(key) db[key] = value self end |