Class: Redis::HashRing
- Inherits:
-
Object
- Object
- Redis::HashRing
- Defined in:
- lib/redis/hash_ring.rb
Constant Summary collapse
- POINTS_PER_SERVER =
this is the default in libmemcached
160
Instance Attribute Summary collapse
-
#nodes ⇒ Object
readonly
Returns the value of attribute nodes.
-
#replicas ⇒ Object
readonly
Returns the value of attribute replicas.
-
#ring ⇒ Object
readonly
Returns the value of attribute ring.
-
#sorted_keys ⇒ Object
readonly
Returns the value of attribute sorted_keys.
Instance Method Summary collapse
-
#add_node(node) ⇒ Object
Adds a
node
to the hash ring (including a number of replicas). -
#get_node(key) ⇒ Object
get the node in the hash ring for this key.
- #get_node_pos(key) ⇒ Object
-
#initialize(nodes = [], replicas = POINTS_PER_SERVER) ⇒ HashRing
constructor
nodes is a list of objects that have a proper to_s representation.
- #iter_nodes(key) ⇒ Object
- #remove_node(node) ⇒ Object
Constructor Details
#initialize(nodes = [], replicas = POINTS_PER_SERVER) ⇒ HashRing
nodes is a list of objects that have a proper to_s representation. replicas indicates how many virtual points should be used pr. node, replicas are required to improve the distribution.
13 14 15 16 17 18 19 20 21 |
# File 'lib/redis/hash_ring.rb', line 13 def initialize(nodes=[], replicas=POINTS_PER_SERVER) @replicas = replicas @ring = {} @nodes = [] @sorted_keys = [] nodes.each do |node| add_node(node) end end |
Instance Attribute Details
#nodes ⇒ Object (readonly)
Returns the value of attribute nodes.
8 9 10 |
# File 'lib/redis/hash_ring.rb', line 8 def nodes @nodes end |
#replicas ⇒ Object (readonly)
Returns the value of attribute replicas.
8 9 10 |
# File 'lib/redis/hash_ring.rb', line 8 def replicas @replicas end |
#ring ⇒ Object (readonly)
Returns the value of attribute ring.
8 9 10 |
# File 'lib/redis/hash_ring.rb', line 8 def ring @ring end |
#sorted_keys ⇒ Object (readonly)
Returns the value of attribute sorted_keys.
8 9 10 |
# File 'lib/redis/hash_ring.rb', line 8 def sorted_keys @sorted_keys end |
Instance Method Details
#add_node(node) ⇒ Object
Adds a node
to the hash ring (including a number of replicas).
24 25 26 27 28 29 30 31 32 33 |
# File 'lib/redis/hash_ring.rb', line 24 def add_node(node) @nodes << node @replicas.times do |i| key = Zlib.crc32("#{node.id}:#{i}") raise "Node ID collision" if @ring.has_key?(key) @ring[key] = node @sorted_keys << key end @sorted_keys.sort! end |
#get_node(key) ⇒ Object
get the node in the hash ring for this key
45 46 47 |
# File 'lib/redis/hash_ring.rb', line 45 def get_node(key) get_node_pos(key)[0] end |
#get_node_pos(key) ⇒ Object
49 50 51 52 53 54 |
# File 'lib/redis/hash_ring.rb', line 49 def get_node_pos(key) return [nil,nil] if @ring.size == 0 crc = Zlib.crc32(key) idx = HashRing.binary_search(@sorted_keys, crc) return [@ring[@sorted_keys[idx]], idx] end |
#iter_nodes(key) ⇒ Object
56 57 58 59 60 61 62 |
# File 'lib/redis/hash_ring.rb', line 56 def iter_nodes(key) return [nil,nil] if @ring.size == 0 _, pos = get_node_pos(key) @ring.size.times do |n| yield @ring[@sorted_keys[(pos+n) % @ring.size]] end end |
#remove_node(node) ⇒ Object
35 36 37 38 39 40 41 42 |
# File 'lib/redis/hash_ring.rb', line 35 def remove_node(node) @nodes.reject!{|n| n.id == node.id} @replicas.times do |i| key = Zlib.crc32("#{node.id}:#{i}") @ring.delete(key) @sorted_keys.reject! {|k| k == key} end end |