redisのperlクライアントのperformance比較

比較対象
Redis
Redis::Fast
Redis::Client

10万件set get hset hget
Redis::Clientが一番よかった

Redis::Clientが10sくらい、Redis::Clientが6sか7sくらい


うーん、オンメモリだからもっと爆速なのかと思っていたが、秒間1万くらいかー
Redisはdump機能とか簡単に扱えてWebアプリ用途ではいいのかもしれないが、
今やりたいのはとにかく高速に読み書きすることなのでダメだなー

普通にハッシュでの読み書きなら0.1秒以下でできるので、なんかオンメモリの良さが失われている気しかしない。
ハッシュをスクリプト間で共有できえればそれだけでいいのに。
もっとシンプルなやつないのか

                  • -

http://redis.io/topics/benchmarks

Redis is a server: all commands involve network or IPC roundtrips. It is meaningless to compare it to embedded data stores such as SQLite, Berkeley DB, Tokyo/Kyoto Cabinet, etc ... because the cost of most operations is precisely dominated by network/protocol management.

                • -

うーん、どうやらmemcachedやredisはネットワーク系でオンメモリ本来の良さが発揮できないっぽい。
その点、tokyo cabinetやkyoto cabinetに関しては、ネットワークに抽象化したものと、直接アクセスできるものの2つの経路が用意されてたような気がする。kyotocabinetとkyototycoonがその違いだったはず。
kyototycoonを使うと、こちらでも同じくネットワークの摩擦がボトルネックになる。
kyotocabinetのオンメモリ版が、他のプロセスと共有できればいいのだけど、それもたぶん方法がなさそうだ。

やっぱkyotocabinetも無理っぽい
http://fallabs.com/kyotocabinet/spex.html

Sharing One database by Multiple Processes
Multiple processes cannot access one database file at the same time. A database file is locked by reader-writer lock while a process is connected to it. Note that the `BasicDB::ONOLOCK' option should not be used in order to escape the file locking mechanism. This option is for workaround against some file systems such as NFS, which does not support file locking mechanisms.
If you want to get multiple processes to share one database, use Kyoto Tycoon instead. It is a lightweight database server as network interface to Kyoto Cabinet.

          • -

進展


kyotocabinetでいけるのかを調べる。

やっぱだめだ。
perlクライアントからでは、プロセスを終了するとメモリ上のデータも消えてしまうみたい。

## write
my $db = new KyotoCabinet::DB;
if (!$db->open('*', $db->OWRITER | $db->OCREATE)) {
printf STDERR ("open error: %s\n", $db->error);
}
# store records
if(0){
if (!$db->set('var1', '123')){
printf STDERR ("set error: %s\n", $db->error);
}
}

## sead
my $cur = $db->cursor;
$cur->jump;
while (my ($key, $value) = $cur->get(1)) {
printf("%s:%s\n", $key, $value);
}
$cur->disable;

$db->close();