class Dalli::Ext::Spymemcached::Ring

Impliments the same hashing algorithm to chose a server as spymemcached Java library.

Constants

MAX
MIN

Public Instance Methods

hash_for(key) click to toggle source
# File lib/dalli-ext-spymemcached/ring.rb, line 13
def hash_for(key)
  hashed_key = key.each_byte.inject(0) do |hash, byte|
    hash = 31 * hash + byte
    hash = MAX - (MIN - hash) + 1 while hash < MIN
    hash = MIN - (MAX - hash) - 1 while hash > MAX
    hash
  end

  hashed_key & "ffffffff".hex
end
server_for_key(key) click to toggle source
# File lib/dalli-ext-spymemcached/ring.rb, line 24
def server_for_key(key)
  server = @servers[hash_for(key) % @servers.length] if @servers.any?
  Dalli.logger.debug { "Dalli::Ext::Spymemcached#server_for_key:
    key: #{key.to_s},
    hash: #{hash_for(key)},
    server: #{server.try(:name)}" }

  unless server && server.alive?
    raise Dalli::NetworkError, "No servers available"
  end

  server
end