tokyotyrant

����NoSQL\������¼\���\��㏢�¼\¹\���\����¼\¹\���\��\���\�����¡ߏ�����¼¹������·���������·������

��돪��������������������\���\���\�돢����½��Џ��ޏ��������������������«�����������ď��������ޏ��������¹���̏�¡�¼���������½��������������������䏢����¼¹��������ҏ��·���������������������·�����ď�¡��³���������������������¹���쏢�������������������я��쏢��(����Ž��Ρ��Ž���)������

NoSQL\������¼\���\��㏢�¼\¹\���\����¼\¹\���\��\���\���
NoSQL\¼\\㏢¼\¹\\¼\¹\\\\

NoSQL\������¼\���\��㏢�¼\¹������������������������½��Џ��«������������ ¹��Џ�����½��� ���������Џ�����½��Џ��������¹�������������ď���̏���

��돪������������������ NoSQL ������������������\­���¼\������¼\�������\Ð\���\������¼\�������������������������������������������¡��ӏ����������������ď����� NoSQL ������������²��ď����������������Ï��폢¡ߏ��������«����\���\������¼\·\���\���\���\������¼\���\��㏢�¼\¹�����������������á돫������Ï������폢¡ߏ�����µ��ď�����������»�ߏ��������������������������������������������ď������������������������������������«������»�ߏ��������������¹��¡��̏�¡񏪴����������·�����������Ï�������������돪�½��������¡돫������������ҏ����������½Ð���¹�������������������������«���������«�����������Џ��������¹��������������¡�²��ď��«�����������������Џ�����¼����������̏����������·��¡��½���³��������¡񏪳���½��Џ����ҏ��­���������«���ޏ��������·�����������������ď��������ޏ����ď�������¡�¡�������

NoSQL\������¼\���\��㏢�¼\¹��������돪㏢�«������\���\������¼\���\���\�돢����¹��ԏ���������\���\������¼\·\���\���\���\������¼\���\��㏢�¼\¹��������������·��𡯏����������������������Ï�����������µ�̏�����������½������������ҡ�·�����Ï�¡ߏ����������������Ï����Џ����я�����������������������������������»�����𡯏��������¹���̏�¡��½���³������������»������������³���������¹����������������¾��������������Џ��·���������������¹��¡����������ď�¡��½���³���������������¹����������̏���ߏ��̏���������ď�����������½»��Џ�������������������𡭏������돫������ԏ��������·�����������Ï�¡�

���������������·����������������NoSQL\������¼\���\��㏢�¼\¹������»�����𡯏��Ð��¡�¾���¹������������������������������������³�����я�����������³��⏢����½����������������­����������������»�����𡯏��������Ð\������¼\���\¹\���\���������쏪����»������̏�����𡯏��������������쏢¡ߏ����������������������Ï��³�����������ҏ�������𡯏����ď�����������»�ߏ�������������������������¡񏪳���½��Џ��������������½������¹�����𡯏������ޏ��������������¼¹������·���������������������¹��¡�

NoSQL\������¼\���\��㏢�¼\¹�������돫����������������������������������������������¹�������������������̏��������������������¹���̏���100¼��������돪�¾���������¡񏪳���½��Џ��������������½�������������������������������½�����쏢�����������������������·������ memcached, Tokyo Tyrant, Redis, MongoDB, ���½���·��������¡�����������������������NoSQL\������¼\���\��㏢�¼\¹�������������돫������Ï������������¹���̏�����¾��������������������ҏ�����\��\��\������¼\����������������� HandlerSocket ������������������������¼�����������·���������������������������¹��¡�

������¼��ԏ��������·��������������¡�\���\������¼\·\���\���\���\������¼\���\��㏢�¼\¹�����Ң�������³��������ޏ����������̏����㏪���̏����Џ��·��������������������¡�\���\������¼\·\���\���\���\������¼\���\��㏢�¼\¹�����ҏ����¡��������쏢����������������������������������ď�������ҏ����只�������·���������������������¹��¡�������������������������½���µ�������������µ���¼��ԏ�����¡��� NoSQL �����������������������Ï������̏���¹��ԏ��������������������������·���������ޏ�����¾��䏢�·������������������������������������¡ߏ����������������������ď����������Ï������������̏��о����������¹��¡��½�����Ï����������������ď������������Ð���·��������¡�

����NoSQL�����������������������������ď����������������Ï����������á돪؏���������������«
����NoSQL\������¼\���\��㏢�¼\¹���������������������������������Ï�����¼������������������������̏��������������«
���Ï�����������������������������¼����������̏����������̏�����������»�������������̏��ޏ������������«
���Ï��½���������¾������������NoSQL\������¼\���\��㏢�¼\¹������»�������������������³µ����돢���������������á돫������Ï������«
���â���Џ��������쏢���������������Ï�����������������¾��������������������̏����Џ��·�����ď����������������������«��������Џ������������؏��­����
����\���\���\��폢�¼\���\���\¹���������������������̏����㏢�����������«

�����������������������ď����������������ҏ����������������������ď����䏢�������������������������������������¹��¡�

½���������������������¼¹���������������������������������»������������������������������̏����ď�����������������»�ߏ��������������¹���̏�¡�²��ď�������������������돪�½��������¡돫����������̏����������½Ð���»�����ď��³���������̡���ҏ��·����������������������»�ߏ��������������������������¹��¡�¾��䏢�·��������ď�����̏����������я�����������������������¹��Џ����Ώ��������³�����������������ď��������µ�����я����������«���������·���������������»�����я��̏�¡�¡�²��ď��«�����������Ð @sasata299 �돢�����������񏪿��������ҏ����������ď��������ޏ��������Ð��¡�

�����������������Ï��³��������������¡񡭏�ҏ��·������������»�ߏ�����������¼�����ď�ď�����»���������������­���������������������������·�����ď�¡򏪳���²�돢����¼«����̏�����½��Џ����ҏ��̏����������я����������������������������������Ï�������������·������������·�����ď�¡򏪱������������½�����я��������������¹������������¾���������½��Џ��������³������������������������������������ġ����̏��������������½�����Ï��������·�����ď��̏�¡񡭏�����\�������������������«�����������ď��Ï��á��

NoSQL_1

»������������������������¡�

���³�����я��������������������������������������Ώ����ď��������������������������������� (¾Ð) ��¡�

NoSQL_3

�����������������Ï��³��������������¡��½����������������������������¼�����ҏ����������я����������Ώ��������������������µ��������¡�

��돪���������������¡���²��я�����½��������ҏ���������ӏ��·���������������������µ������������½��������\·\¹\���\������������⏪�������������������³������¾���������¼��⏢���������������쏪�����½���·¾������²���������¹��¡����������̏����������Ï�𡭏������������������·�����ď���

����NoSQL\������¼\���\��㏢�¼\¹��������������������������¡ߏ����돪�½��쏪�»���������쏪�����������»

���³��������������������ď��²��я����������������ď����������������돪䏢�·���������­�����ď���NoSQL\������¼\���\��㏢�¼\¹������»����·�����������Ώ�������¡ߏ��������돪䏢�̏����䏩���䏢����³«���µ�����������ď�����6²��я��������돪�»���·���������·�����ď�¡�memcached, TokyoTyrant, MongoDB, HBase, Cassandra ��������¡񏪿������¹������\���\���\�ߏ������������½�����쏢����NoSQL\������¼\���\��㏢�¼\¹������¾���²��Ï��·���������­�����ď��������ޏ��������¹��¡�

������1²��я���RDBMS������NoSQL\������¼\���\��㏢�¼\¹����gihyo.jp ���� µ»½��Џ��¾������¼���
������2²��я���RDBMS������������������¹������������»������»�����𡯏�����memcached����gihyo.jp ���� µ»½��Џ��¾������¼���
������3²��я����������¹������\������¼\���·��ď����ҡ�·��𡯏�����TokyoTyrant����gihyo.jp ���� µ»½��Џ��¾������¼���
������4²��я���\¹\­���¼\���\���\¹������½��������Ï�������·��𡯏�����MongoDB����gihyo.jp ���� µ»½��Џ��¾������¼���
������5²��я�������µ�̏�����\������¼\��ď����ҡ�·�����Ï����ď�����������HBase������Cassandra����gihyo.jp ���� µ»½��Џ��¾������¼���
������6²��я���\���\���\��폢�¼\���\���\¹�����������������Ï������������폢��gihyo.jp ���� µ»½��Џ��¾������¼���


¾������������������������������·���Ð������������������ MySQL, PostgreSQL ���������������Ï����� RDBMS ���̏�������ġ���������������������������¡�������������������������������¾��آ�·����������������NoSQL\������¼\���\��㏢�¼\¹����»��������������������������я����������������Ï��������¼������������»�ߏ����Ï����я��������¹���̏�¡��½���������½���������������������������������������������쏪����»��������������������Џ��������������������������¹���«��������������¡������������̏����㏢¡�³µ����ߏ����������������Ï��«��ġ����������������ޏ����������������������������������������������������������я��������������������������«������»�ߏ��������������¹��¡�

�����������������Ώ���������������������������\���\������¼\������������¹���̏�¡�\������¼\��ď�����\­\���\���\·\������·�����������������������ӏ��·�����ď����������������� memcached, TokyoTyrant ��¡�\¹\­���¼\������������«¹�����𡯏�����¹������������³«���������·�����ď������������·���«������ RDBMS �������������������������������쏢�������������� MongoDB ��¡�\������¼\��ď������̏��������­���������������������������­������½���¹��Џ����Ώ����ҏ����»�����µ���»����������̏���ߏ��̏������������������� HBase, Cassandra �����������������������ġ������������������¹���«��������¡򏪩�̏�돫������½�����¡�

���­�����������������������ԏ���̏�¡��������«�����������������������������ԏ���̏�������������»�ߏ��������������¹���̏�¡��³���������«������NoSQL\������¼\���\��㏢�¼\¹������»����½�����Ï�����»�ߏ���������������������������������»²¹���������¾������·���������������������������й�̏��������������¹��¡�

��½������TokyoCabinet/TokyoTyrant������»��������������������Ώ�����

key-value \¹\���\��������½������̏������� ���µ���µ�����ď����� ���������¹��¡�key-value \¹\���\���������·���������­���¾������������������������������𡯏��Ð memcached ���«������»�ߏ��������������¹���̏�¡񏪤¾������������ TokyoCabinet ������ TokyoTyrant �����������������Ï��������������������������䏢�µ���������������������������¹����������»��µ������������¾����돢�������¹���������쏢����¡�key-value \¹\���\�����������������������̏�����¹��������¡��«��������¡�\������¼\��ď�����\���\���\������������µ������\���\���\���\��������������򏪤������·�����������������������ď�������¡�\µ���¼\Ð���̏���������������������\������¼\��ď���¾�����𡯏��������������������«��¡�

¼�����돪����� mixi ������돪�½���\���\��\���\���»��С���ӏ���������»�������������������»������������������������������������½�����Ï��������¹��¡�

memcached ������\»\���\·\���\��я���������»�������������������»���������������������������¾���¹�����¡�memcached ������\µ���¼\Ð����\���\���\��я��·���������·�����������������ď�������¡�\������¼\��ď����������������¾�����𡯏��������·���������������������¹��¡��½������·���²��� RDBMS ������\��\���\»\¹����½������������·��¡�\���\���\��폢�¼\���\���\¹���̏�����������������­²½���·���������·�����������Ï�����돪���­������¾���¹�����¡�\��\���\»\¹�����ԏ��½�������������������������������·�����������Ï�¡��½���������������Ï�����\�ޏ��¼\¹����\������¼\��ď���������������¼���������������¹���������­����µ�����������������������������¡��«��������¡�\������¼\��ď���¾�����𡯏�������������돢������������������Ï�����¾���¹������������������� memcached ������������¹���������«��������¡�\������¼\��ď���¾�����𡯏����������� TokyoCabinet/TokyoTyrant ���̏�����¾���������»�����𡯏������������������������������������«������»�ߏ��������������¹��¡�

���������³��������������¡��¾����돢��»�����������������������������«���������������������������������¹���̏�¡�TokyoCabinet ���� key-value\¹\���\������µ����½������»���������������������������¡�\������¼\��ď����ҏ����򏪤������·�����ď�������¡�¼���������½Ð���·�����ď�����½Ð���������������¹��¡�TokyoTyrant ������ TokyoCabinet ������\���\���\���\������¼\����ޏ�叢�·��������������돫��������­�����������������Ï��������·������\���\���\��Џ��¼���������¹��¡�\­\���\���\���\���\�������������³��؏���������Ð��⏪С����������¹������\���\���\���\���\���������С�¼������������������������Ï��³���������������³���������������Ï��������¾����돢�̏����؏��ޏ����������������ď��½�����Ï��������¹���

TokyoCabinet ��������������¡�\������¼\��ď��������򏪤��������򏪳����̏�ġ����¹�����쏢���㏢�������¹��¡�����𡯏��Ð���³���������������Ï������������������̏����������������¹��¡�

\���\���\·\���\������¼\���\��㏢�¼\¹  # 1 ������������ key ���������Ð���·������ 1 ������������ value ������»�������
B+-tree \������¼\���\��㏢�¼\¹  # ����ޏ����� key ���������Ð���·�����������ď�ԏ�����\���\³���¼\���������³������¼���������­������
\������¼\���\���\������¼\���\��㏢�¼\¹  # ������������������ key ���������Ð���·�����������ď�ԏ��������������ҏ�����»����������­������

����²��я��������³������������������돪��������돫������������쏢���� key-value \¹\���\���������������������»�������������������������������������������������¡�\���\���\·\���\������¼\���\���¹½������������������\���\���\·\���\������¼\���\��㏢�¼\¹���㏢����»����·�����������Ώ��������¹��¡�

TokyoTyrant/TokyoTyrant ������\���\���\¹\������¼\���

\½���¼\¹������ ���³������������ �����������������������¹��¡���²��я����� Ruby ������»��������������� TokyoCabinet/TokyoTyrant �����ҡ�·�����Ï����ď�������¡�돪�²¼������ 4 ������������\���\���\¹\������¼\������·���������·�����ď�¡򏢱½»��Џ�����������������돪����·���������������¹��¡�

����tokyocabinet-1.4.9.tar.gz
����tokyocabinet-ruby-1.9.tar.gz
����tokyotyrant-1.1.9.tar.gz
����tokyotyrant-ruby-1.9.tar.gz

TokyoCabinet
tar zxvf tokyocabinet-1.4.9.tar.gz
cd tokyocabinet-1.4.9
./configure
make
sudo make install

TokyoCabinet Ruby API
tar zxvf tokyocabinet-ruby-1.9.tar.gz
cd tokyocabinet-ruby-1.9
ruby extconf.rb
make
sudo make install

TokyoTyrant
tar zxvf tokyotyrant-1.1.9.tar.gz
cd tokyotyrant-1.1.9
./configure
make
sudo make install

TokyoTyrant Ruby API
tar zxvf tokyotyrant-ruby-1.9.tar.gz
cd tokyotyrant-ruby-1.9
sudo ruby install.rb

Ruby \Ð\���\���\���\��\���\�돢���� TokyoCabinet ������»��������������������Ώ�����

�����������돢���� TokyoCabinet ������»����·�����������Ώ��������¹��¡�TokyoCabinet �����ҏ���ޏ���������»��������Ï�������¡�\������¼\«\��������������� key-value \¹\���\���������·��������¡�\���\���\·\���¹½������������\������¼\��ď����ҡ�·��𡯏��������¹��¡�

#!/usr/bin/ruby

require 'tokyocabinet'
include TokyoCabinet

hdb = HDB.new # \���\���\·\���\������¼\���\��㏢�¼\¹������»���������

hdb.tune(131071, 4, 10, 0) # ½�������䏪���Ώ�����
hdb.open('tc.hdb', HDB::OWRITER | HDB::OCREAT) # \������¼\��ď��������򏪤���������»���������������������

hdb.put('hoge', 'fuga') # key: hoge, value: fuga
p hdb.get('hoge')       # fuga ���̏����ӏ�����������������������

hdb.close

���������·�����Ï���������������돢�«�����돢¡�

/usr/local/lib/libtokyocabinet.so: libtokyocabinet.so.8: 
cannot open shared object file: No such file or directory

���������������Ï�����\��\������¼����½Ð���������­������¾���¹�����������������¡�/etc/ld.so.conf ������ /usr/local/lib �����ҏ�����²������·��������¡�돪�²¼������\³\���\���\���������¼���¹��ԏ��·���������������������µ��������¡�/etc/ld.so.cache ����¹¹���·���µ��������¡����Ï��­\���\���\���\���\������̏��«���������«�����������������Ï����������������������������돢�������¹��¡�

sudo /sbin/ldconfig

Ruby \Ð\���\���\���\��\���\�돢���� TokyoTyrant ������»��������������������Ώ�����

���µ������¡�¼������� TokyoTyrant ������»����·�����������Ώ��������¹��¡�����������»��������������� TokyoTyrant ������\µ���¼\Ð������µ�������돢�·���������¹��¡�\���\���\���\���\��������������� 1978 ������\����¼\��������������ԏ�����¼��؏��ޏ��������¹��¡�

sudo /usr/local/sbin/ttservctl start

#!/usr/bin/ruby -Ku

require 'tokyotyrant'
include TokyoTyrant
 
rdb = RDB::new
rdb.open('localhost', 1978)

rdb.put('hoge', '\���\���')
p rdb.get('hoge') # '\���\���'

rdb.close

�����쏢���폢����¡��µ»��ӏ���돢�­���������·�����ď�¡����ď�������¡�TokyoCabinet �������������­�������돫���������������¡�²��ď�����½�������䏪���Ώ���������\������¼\��ď��������򏪤�������������������������������¹��ԏ����������������������������������������Ï�����µ������̏�¡�¡�¡�����»�ߏ����������ď�������¡�/usr/local/sbin/ttservctl ���������������������Ώ��������̏��¾½��Џ��­���µ�����������������������������Ώ����ď��������������¹��¡�\������¼\���\���\���\���\��������� /var/ttserver \���\��\���\���\���\�����������돫�����µ���������������¹��¡�

���³���³��������������¡�TokyoTyrant ������¼«\��\���\���\³\�����������·���������������������������¹���̏�¡񏪤¾������������ HTTP ������ memcached �����Ρ�¹������\��\���\���\³\�����������������·�����Ï��³����������½Ð���������������¹���������ď��������·��¡񏪿­�����⡭��䏢����������\µ\����¼\������·������������������������������¡��½���������ď�������¡������������� memcached ������»�����������������������������¡�TokyoTyrant ������������¹¹���¹������¾���¹�����¡��³���������̏����㏢��������¹¹���������Ð�ޏ�Џ��������­���������³���������������������­���������\�������������¹��¡�

# memcached ������¾���¹���
MemCache::new 'localhost:11211'

# TokyoTyrant ������¾���¹���
MemCache::new 'localhost:1978' # \����¼\�������������¹¹���������ޏ�����������򏫳

����������¡񏪳��䏪���ӏ�����\µ���¼\Ð����\���\���\��я��·������������\������¼\��ď���¾�����𡯏������������������«�����������Ï��«������³���������·�����������Ώ��������·�����ď�¡򏪩�̏����ӏ����� key ����������̏����ӏ����� value ������\»\���\������·��¡�돫������� TokyoTyrant ������\µ���¼\Ð�����ҏ������������·���������¹��¡��½������������¡�\µ���¼\Ð�����ҏ�돩������㏪�폢����¾������²������ key ������\��\���\»\¹���¹��������������¡�¡��µ»��� value ������\��\���\»\¹���¹���������³����������½Ð���������������·�����ď���\¹\Ð\���\·\�����¡�

��돪�������������\���\���\���\������¼\���������¼��������������������Ώ��������·�����ď�¡����������������Џ�����������������½��Џ��­��������㏢����½�������ߏ��������¹���«��������������¡�

require 'rubygems'
require 'memcache'
require 'benchmark'

memcache = MemCache::new 'localhost:11211'
tokyo    = MemCache::new 'localhost:1978'

def random
  list = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
  return Array.new(16) do
    list[rand(list.size)]
  end.join
end

array = []
10_000.times do 
  array << random
end
# array: # ["7JN1r0Ozgw0f1G2q", "SAZxr0OzsRdf15yO", ...]

Benchmark.bm(20) do |b|
  b.report 'memcached-write' do
    array.each do |ary|
      memcache.set ary, 1, 120
    end
  end

  b.report 'tokyo-write' do
    array.each do |ary| 
      tokyo.set ary, 1
    end
  end

  b.report 'memcached-read' do
    array.each do |ary| 
      memcache.get ary
    end
  end

  b.report 'tokyo-read' do
    array.each do |ary| 
      tokyo.get ary
    end
  end
end

���½������·���²������������³��������������¡�

                         user    system     total       real
memcached-write      0.050000  0.300000  0.350000 ( 0.883403)
tokyo-write          0.040000  0.610000  0.650000 ( 0.972349)
memcached-read       0.050000  0.440000  0.490000 ( 0.889803)
tokyo-read           0.130000  0.460000  0.590000 ( 1.000752)

memcached �����������������㏢���������������叢���������я����������㏢���������������������»�����я�������¡��³���������������������������¹������¾��������������������̏����Џ��¹���������³����������½Ð���������½�����Ï��������¹��������¡򡭏�䏪���ԏ�������

�����������ď�¡���²��я���������\���\���\·\���\������¼\���\��㏢�¼\¹���㏢�·���«»����·���������������������»�����я��̏�¡��� B+-tree \������¼\���\��㏢�¼\¹���㏢��������\������¼\���\���\������¼\���\��㏢�¼\¹���㏢����»�����𡯏��Ð��¡�RDBMS ���������������Ï�����\������¼\��ď����ҡ�·�����Ï��³����������²������½���������¹��¡�1 ������������ key �����������ď�ԏ����� value �����ҏ��³�����؏��ޏ����ď�������¡�\������¼\��ď����ҏ����������㏪������𡯏����ď����������������������������ď��³���������������������­�����������������Ï�����������������������������¡�ġ����¹�������ޏ�Џ����Џ��̏����̏��­���½�����Ï�¡�(*���­��\`)

�����ď�������¡�������������������������·�������������������������������������«���������������������������폢����������·������������«��������¡�¡��½�����я��������������­��������������¡�TokyoTyrant ������ ActiveRecord ���������������Ï�������·��𡯏����������������������� Miyazaki Resistance ���̏����������̏��½�����Ï��������¹��¡����������������Џ�������·������������·�����������·��𡯏����������������������Ï���������½��؏��«���������������¹��¡����������¾����돢��½���돫������������µ��Џ����ҏ��������²�����я��«���»�����я��������������«�����я�¡�

�����������������Ï��������ޏ�������¡�TokyoCabinet/TokyoTyrant ����������������������

���Ï�����������½��Џ��­��������㏢����½½����̏�����������������
����\������¼\��ď����¡ޏ�����³���­���̏�����������\µ���¼\Ð����\���\���\��я��·������������\������¼\��ď�����»�������������������������������
����memcached �����Ρ�¹������\��\���\���\³\������̏�������������������¡�memcached �����������叢���䏩��ޏ����������������Ï�������·��𡯏�����
����RDBMS ���������������Ï�����½��������Ï�������·�����Ï��³������������²������½
����Miyazaki Resistance �����������\���\��\���\���
karaage299 at gmail.com
��돪������������µ­»���
\���\��\���\���\���\���