kyototycoonをmemcachedモードで使う

kyototycoonをmemcachedモードで使ったときの不思議な現象が出たのでメモ

使用したバージョンはこれ

kyotocabinet-1.2.76

kyototycoon-0.9.56

MacOS10.8

  • まずはOKパターン
$ /usr/local/bin/ktserver -host 127.0.0.1 -th 2 -plsv /usr/local/libexec/ktplugservmemc.dylib -plex 'opts=f' ./ktserver.kch >> ./ktserver.log
$ telnet localhost 11211
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
STAT pid 88068
STAT uptime 8
STAT time 1360107774
STAT version KyotoTycoon/0.9.56
STAT pointer_size 64
STAT curr_connections 1
STAT threads 16
STAT curr_items 9800
STAT bytes 6794776
STAT db_apow 3
STAT db_bnum 1048583
STAT db_chksum 188
STAT db_count 9800
STAT db_dfunit 0
STAT db_flags 1
STAT db_fmtver 5
STAT db_fpow 10
STAT db_frgcnt 0
STAT db_ktcapcnt -1
STAT db_ktcapsiz -1
STAT db_ktopts 0
STAT db_librev 13
STAT db_libver 16
STAT db_msiz 67108864
STAT db_opts 0
STAT db_path ./ktserver.kch
STAT db_realsize 6794776
STAT db_realtype 48
STAT db_recovered 0
STAT db_reorganized 0
STAT db_size 6794776
STAT db_trimmed 0
STAT db_type 48
STAT set_hits 0
STAT set_misses 0
STAT get_hits 0
STAT get_misses 0
STAT delete_hits 0
STAT delete_misses 0
STAT incr_hits 0
STAT incr_misses 0
STAT decr_hits 0
STAT decr_misses 0
STAT cmd_set 0
STAT cmd_get 0
STAT cmd_delete 0
STAT cmd_flush 0
END
  • NGパターン
$ /usr/local/bin/ktserver -host 127.0.0.1 -port 11211 -th 2 -plsv /usr/local/libexec/ktplugservmemc.dylib -plex opts=f ./ktserver.kch
$ telnet localhost 11211
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stats
Connection closed by foreign host.

ポートを明示的に指定すると落ちてしまう

memcachedで日本語キーを扱う

memcachedの代わりにkyoto tycoonを試してみようとしています。

kyoto tycoonはmemcachedと同じインターフェースで起動できるとのことで、当然memcachedライブラリが使えます

日本語のキーが使えるかどうか確認します

  • memcachedライブラリ
$ su
# export http_proxy=proxy:port
# gem install memcached
#!/bin/env ruby -Ku 
# -*- encoding:utf-8 -*-
require "rubygems"
require "memcached"
require "nkf"

cache=Memcached.new "localhost:11211"
cache.set("sony","6758",0)
puts cache.get("sony")
key="ソニー"
cache.set(key,"ソニー",0)
puts cache.get(key)
$ ruby mem.rb 
6758
/Library/Ruby/Gems/1.8/gems/memcached-1.5.0/lib/memcached/memcached.rb:630:in `reraise': Key {"ソニー"=>nil} (Memcached::ABadKeyWasProvidedOrCharactersOutOfRange)
	from /Library/Ruby/Gems/1.8/gems/memcached-1.5.0/lib/memcached/memcached.rb:608:in `check_return_code'
	from /Library/Ruby/Gems/1.8/gems/memcached-1.5.0/lib/memcached/memcached.rb:306:in `set'
	from mem.rb:11

なんかだめ。。

ちなみにperlだと

#!/usr/bin/perl

use strict;
use warnings;
use Cache::Memcached::Fast;

my $memd=Cache::Memcached::Fast->new({
		servers => [ { address => 'localhost:11211' }], 
}); 

# 値を追加 key => value
my $key='ソニーal';
$memd->set($key=> 'そにー2');

# 値を取得
my $id = $memd->get($key);
print "$id\n";
$ perl mem.pl
そにー2

rubyのライブラリが悪いようだ

ちなみにOSはMountain Lion