PerlでRedisのSRANDMEMBERを実行して結果を取得

追記@2014-07-30

PerlのRedisライブラリですが、Redis::hiredisが一番使いやすいと思います。ほぼ、Redisプロトコルをしゃべるような感じです。なんとなくとっつきにくいかもですが、Redisプロトコルは簡単で読みやすいので1分で慣れると思います。


PerlのRedisライブラリはいろいろとありますが、RedisDBを使って表題のことを行いました。このライブラリがおそらくいちばん汎用的です。

Redisというそのものずばりのライブラリがあるんですが、なんとsrandmember命令の要素数を選べません。

というわけで、RedisDBというものを用いました。汎用的ですが例によって分かりにくいライブラリで、(ヽ´ω`)ハァ…って感じです。まあタダで使っているのに文句言うなよって感じですけれどね。。。ドキュメントに具体例がほとんどなくて、replyを取得するときに-1というindexを使ったりと、もうなんていうか。。。

下記にコードを載せます。内容としては、
– 0~100までの数字を入れた配列を用意
– Redisに接続して内容物を削除
– パイプラインで、先の配列を「myset」という名のSET型に挿入
– 3件ランダムに取得して、表示
です。私はPerl素人なので、変な記述があるかもしれません。

use RedisDB;

$max = 100;
$num = 3;

@pairs = ();
for($i = 0; $i < $max; $i++){
        push @pairs, $i;
}

$redis = RedisDB->new(host => 'localhost', port => 6379);

# 一旦削除
$redis->send_command('FLUSHALL');

# パイプラインのつもり
$redis->send_command('MULTI');
foreach $pair (@pairs) {
        $redis->send_command('SADD', 'myset', $pair);
}
$redis->send_command('EXEC');

# 3件ランダムに取得
$redis->send_command('SRANDMEMBER', 'myset', $num);
@results = $redis->get_all_replies;

for($i = 0; $i < $num; $i++){
        print $results[-1]->[$i] . "\n";
}