tokyotyrantをRubyから使う

localhostで動いているtokyotyrantに接続する時にホスト名で接続できなくて、(connection refusedというエラーが返る)127.0.0.1って書いたらできた。これにドはまりしてて20時間ぐらい悩んでた。なんでホスト名で接続できないんだろう。自分でrequire socketしてアドレス解決すればいいけど面倒だな・・・

別のUbuntuマシンでやってみたらlocalhostで接続できた。俺のMacbookProの問題かもしれない


ちなみにconsoleからtokyotyrantを管理できる tcrmgr というツールではlocalhostで接続できる。これはCで書かれていてtokyotyrantをソースからmakeしてインストールしたら一緒に入ってた。
memcacheのプロトコルでもread/writeできるので、gemのmemcacheで使ってみたらこっちはホスト名で接続できた。



gemにあるtokyocabinetrubyラッパーが少し古いので、最新版からgemを作ってインストールした

wget http://1978th.net/tokyocabinet/rubypkg/tokyocabinet-ruby-1.30.tar.gz
tar -zxvf tokyocabinet-ruby-1.30.tar.gz
cd tokyocabinet-ruby-1.30
gem build tokyocabinet.gemspec
sudo gme install tokyocabinet-1.30.gem

tyrantはrubygemsがに最新版があるけど、なんとなく自前でgem作った

wget http://1978th.net/tokyotyrant/rubypkg/tokyotyrant-ruby-1.13.tar.gz
tar -zxvf tokyotyrant-ruby-1.13.tar.gz
cd tokyotyrant-ruby-1.13
gem build tokyotyrant.gemspec
sudo gem install tokyotyrant-1.13.gem


rubyから使う

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'tokyotyrant'
include TokyoTyrant

rdb = RDB::new
if !rdb.open('127.0.0.1', 1978)
  STDERR.puts rdb.errmsg(rdb.ecode)
end

rdb['a'] = 1234
rdb['b'] = 'zanmai'
p rdb.keys

rdb.keys.each{|k|
  puts "#{k} => #{rdb[k]}"
}

rdb.close


memcacheとして使う

#!/usr/bin/env ruby
require 'rubygems'
require 'memcache'

tc = Memcache::new(:server => 'localhost:1978')

puts tc.set('name', 'shokai')
puts tc.get('name')

場合によってはmemcacheで書いておいた方が置き換えもできていいかもしれないけど、Rubyのmemcacheライブラリが遅いらしいし
http://blog.katsuma.tv/2010/06/memcached_vs_tokyocabinet_vs_tolyo_tyrant_vs_redis.html
そもそも用途が違う


tokyocabinetはCで書かれた部分があるからJRubyからは使えないが、tyrantはgemはpure rubyなのでJRubyからも実行できる。
memcacheはJRubyからも使えるが、メッセージが出る。

memcache is not using native bindings. for faster performance, compile extensions by hand or install as a local gem

ちょっと遅いらしい