Redisのソート済セット型を利用すると、簡単にランキングが作れます。
今回は簡単ランキングの御紹介です。
環境を整えよう!
WEBサーバのApacheとPHPのインストールしようね
1 |
# yum install httpd php |
redisとPHPでredisを操作するモジュールを入れます。
1 2 |
# yum install epel-release # yum --enablerepo=epel install php-pecl-redis redis |
WEBサーバとRedisを起動させちゃおう!
1 2 3 4 |
# systemctl restart httpd # systemctl enable httpd # systemctl start redis # systemctl enable redis |
プログラムを書きましょうね
金魚をすくえた数で順位をつけていきましょ~。
ranking.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# vi /var/www/html/ranking.php <?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->delete('kingyoSkuiRanking1'); $kingyoScore = array( 'Tanaka' => 3, 'Tarou' => 6, 'Ken' => 12, 'Yuu' => 15, 'Emily' => 15, 'Hanako' => 6, 'John' => 20, 'Sato' => 1, 'Natary' => 2, 'Honda' => 1, 'Mary' => 55 ); foreach( $kingyoScore as $player => $score ) { $redis->zAdd( 'kingyoSkuiRanking1', $score, $player ); } $result = $redis->zRevRange( 'kingyoSkuiRanking1', 0, 9, true ); // 1. スコアの高い順から降順で10人分リストを取得する var_dump($result); // array(10) { ["Mary"]=> float(55) ["John"]=> float(20) ["Yuu"]=> float(15) ["Emily"]=> float(15) ["Ken"]=> float(12) ["Tarou"]=> float(6) ["Hanako"]=> float(6) ["Tanaka"]=> float(3) ["Natary"]=> float(2) ["Sato"]=> float(1) } echo "<hr/>"; foreach($result as $player => $score) // 2. 自分のキーとポイントを取得 例として1位の[Mary] => float(55) { ++$score; // 3. 自分のポイントに+1を行い、自分より多いユーザ数を設定する Maryの55+1=56 $rank = ($redis->zCount('kingyoSkuiRanking1', $score, '+inf')+1); // 4. 56のスコアのユーザは0, そこに+1を足してMaryの順位である1になる echo "{$player}={$rank}<br/>"; } |
Redisは同率スコアの場合に、先に登録されているユーザの順位を高くしてしまうので、1~4の加工処理が必要です。
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 |
array(10) { ["Mary"]=> float(55) ["John"]=> float(20) ["Yuu"]=> float(15) ["Emily"]=> float(15) ["Ken"]=> float(12) ["Tarou"]=> float(6) ["Hanako"]=> float(6) ["Tanaka"]=> float(3) ["Natary"]=> float(2) ["Sato"]=> float(1) } Mary=1 John=2 Yuu=3 Emily=3 Ken=5 Tarou=6 Hanako=6 Tanaka=8 Natary=9 Sato=10 |
大丈夫そうです。
お疲れ様です。