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
ご利用下さい。