« cpanfileのrequiresにURLを直接指定するのは好ましくない | メイン | サーバーマシンのコア数に応じてworker数を調整する方法 »

2013年6月 7日

Redis::LeaderBoardっての書いてた

RedisのSorted Setがランキング作るのとかに便利だよーってのは今や多くの人に知られるところですが、 同率問題とかがめんどくさかったりするので、その辺解決したやつを書いてみました。 というか、このへんみなさん個別に書いてると思うんですけど、色々めんどくさくなってカッと なってCPANに上げました。Synopsis丸コピですが、以下のような感じで使います。

use Redis;
use Redis::LeaderBoard;
my $redis = Redis->new;
my $lb = Redis::LeaderBoard->new(
    redis => $redis,
    key   => 'leader_board:1',
    order => 'asc', # asc/desc, desc as default
);
$lb->set_score('one' => 100');
$lb->set_score('two' =>  50');
my ($rank, $score) = $lb->get_rank_with_score('one');

# memmber object (オブジェクトが欲しい人のため)
my $member = $lb->find_member('two');
$member->score(90);
my $rank2 = $member->rank;

$rankings = $lb->rankings(offset => 0, limit 10);
  • 同率問題を考慮したランキングが取れる
  • ランキング一覧が取れる
  • 値が昇順の場合でも降順の場合でも同じようなインターフェースで扱える

と言った感じになっています。

Redis2.8で同点問題解消したやつが入るってことで、それを待とうかと思ってたん ですが、以下のissueを見ると、今提案されているパッチがそのまま取り込まれる 訳ではなく再設計みたいな流れになっているようで、もう少し時間がかかりそうだったので、 取り急ぎユニークランキングの実装が必要だったのでCPANに上げた次第。

https://github.com/antirez/redis/issues/943

ご利用下さい。

投稿者 Songmu : 2013年6月 7日 11:09