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にあるtokyocabinetのrubyラッパーが少し古いので、最新版から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
ちょっと遅いらしい