kedama 0.1.0

https://bitbucket.org/winebarrel/kedama
https://rubygems.org/gems/kedama

毎度毎度のこまいライブラリのリリースです。

何これ?

libketamaRubyポートです。
実はバインディングがあったりするんですが、元のAPIにあんまり汎用性がなくてにんともかんとも。

使い方

Nodesクラスにサーバ名なりノード名なりをつっこんで、Consitent Hashingで与えられたキーに対応する名前を返します。
パフォーマンスは不明ですが、シリアスなKVSでの利用は想定してません。

require 'kedama'

nodes1 = Kedama::Nodes.new
nodes1.add('1.2.3.4:11211',  900)
nodes1.add('5.6.7.8:11211',  300)
nodes1.add('9.8.7.6:11211', 1500)

hash1 = nodes1.to_h

10.times do |i|
  i = i.to_s
  puts i + "\t" + hash1[i]
end

puts '---'

nodes2 = Kedama::Nodes.new
nodes2.add('1.2.3.4:11211',  900)
nodes2.add('9.8.7.6:11211', 1500)

hash2 = nodes2.to_h

10.times do |i|
  i = i.to_s
  puts i + "\t" + hash2[i]
end


~/work$ ruby test.rb
0 5.6.7.8:11211
1 5.6.7.8:11211
2 9.8.7.6:11211
3 1.2.3.4:11211
4 1.2.3.4:11211
5 1.2.3.4:11211
6 1.2.3.4:11211
7 9.8.7.6:11211
8 9.8.7.6:11211
9 9.8.7.6:11211

    • -

0 9.8.7.6:11211
1 9.8.7.6:11211
2 9.8.7.6:11211
3 1.2.3.4:11211
4 1.2.3.4:11211
5 1.2.3.4:11211
6 1.2.3.4:11211
7 9.8.7.6:11211
8 9.8.7.6:11211
9 9.8.7.6:11211


追記
10万件で40倍の差か。31,026qpsだし、利便性重視ならそこそこ使えるかな。


~/work$ time ./libketama_test

real 0m0.077s
user 0m0.070s
sys 0m0.000s
~/work$ time ruby test.rb

real 0m3.223s
user 0m2.700s
sys 0m0.350s

#include <ketama.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
  ketama_continuum c;
  ketama_roll( &c, "servers.txt" );

  printf( "%s\n", ketama_error() );

  int i;
  for ( i = 0; i < 100000; i++ )
  {
    char k[10];
    sprintf( k, "%d", i );
    unsigned int kh = ketama_hashi( k );
    mcs* m = ketama_get_server( k, c );

    //printf( "%u %u %s\n", kh, m->point, m->ip );
  }

  return 0;
}
require 'rubygems'
require 'kedama'

nodes1 = Kedama::Nodes.new
nodes1.add('1.2.3.4:11211',  900)
nodes1.add('5.6.7.8:11211',  300)
nodes1.add('9.8.7.6:11211', 1500)

hash1 = nodes1.to_hash

100000.times do |i|
  i = i.to_s
  hash1[i]
end