https://bitbucket.org/winebarrel/kedama
https://rubygems.org/gems/kedama
毎度毎度のこまいライブラリのリリースです。
何これ?
libketamaのRubyポートです。
実はバインディングがあったりするんですが、元の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_testreal 0m0.077s
user 0m0.070s
sys 0m0.000s
~/work$ time ruby test.rbreal 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