読者です 読者をやめる 読者になる 読者になる

Debuginfo

思考とアウトプット

RedisのNamespaceを考えるときはselectでDBを切り替える[Perl][Redis]

複数のクライアントが1つのRedisサーバインスタンスに接続してデータを扱いたいと思うのは普通だと思います。(特にリソースの少ないVPS環境では)。

そこで、Namespaceについて調べていたところ、redis-namespaceというRubyのライブラリは見つかりました。ソースを読んでみると、prefixを追加したキーを用いてNamespaceを実現しているようです(e.g. #namesapce:#keyみたいな)。Perl Moduleでも書くかなと思いましたが、この場合、flushdbを使いたいときにキーを区別して消すことができないのであまり好ましくないようです。しかも、Redisの仕様に追従していくのもModuleメンテが大変そうです。もう少し調べてみると、selectでDBを切り替えられそうです^^

PerlのRedis Moduleではselect()を使う事ができるのでNamespaceを解決できそうです。

use Redis;
my $db = { ‘foo’ => 0, ‘bar’ => 1} ;
my $r = Redis->new;
$r->select($db->{foo});
$r->set( ‘a’ => ‘b’); # on db0
$r->select($db->{bar});
$r->set( ‘a’ => ‘c’); # on db1

別プロセスからは使うときはセントラルな設定ファイルを作って使えばOKかな。

# on $APP_ROOT/etc/redis_client.conf
foo: 0
bar: 1
hoge: 2

で、

use YAML:
use Redis;
my $ref = YAML::LoadFile(“$APP_ROOT/etc/redis_client.conf”;
my $r = Redis->new;
$r->select($ref->{bar});

思いつくのはこんな感じ。もっといい方法があるのかな。 とりあえず、複数クライアントから1つのRedisサーバインスタンスにアクセスし使えそうです^^