今回のブログを担当する中村です。
今日は「リアルタイムランキング」の実装について書こうと思います。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
モバイルソーシャルゲームにおいて「リアルタイムランキング」の需要は大きいと言えます。
その理由はソーシャル性のUPが図れるからです。
例えば、LINEPOPでランキングが上がった(他のユーザーを追い越した)とき、自慢する機能がありますが、もし「リアルタイムランキング」でなかったらどうなるでしょうか?LINEを介して届いたメッセージを見て、LINEPOPを起動してみたら「ランキングは30分毎に反映されます」ということで追い抜いた情報が反映されていない。これでは臨場感がありませんね? |
しかし「リアルタイムランキング」をDBサーバへのリクエストで実装しようとすると負荷がかかりすぎます。
そこでDBに負荷をかけず、簡単に「リアルタイムランキング」を実装方法としてRedisを利用する方法があります。
Redisは「remote dictionary server」の略でオープンソースのkey-valueデータストアです。
同様のものとしてmemcachedが存在しますが、
Redisはmemcachedと違い、value部分がデータ構造をしています。
(単に文字列、数値だけを保存するのではなくリスト型なども保存できる)
それにより、より自由なデータ管理が可能です。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
今回は最近AWSのElastiCacheでRedisが使えるようになったこともあり、AWSでRedisを使ってみたいと思います。
AWSのElastiCacheメニューから新しいインスタンスをLaunchします。
今までmemcachedしか選べなかったのですが、今はRedisを選べるようになっています。
このまま進んでインスタンスを生成してください。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
次にWEBサーバにRedisクライアントをインストールします。
Redisをインストールするにはgitが必要になりますので、今回はgitインストールからコマンドを記述します。
//gitインストール〜redisインストール sudo yum install git-core git clone "https://github.com/nicolasff/phpredis.git" cd ./phpredis/ phpize ./configure make sudo make install //redisをPHPで有効にするためにphp.iniに追記します sudo vim /etc/php.ini (extension=redis.soを追記) //設定を反映させるためにApacheをリロードします sudo service httpd reload
これでPHP上でRedisを使うことができるようになりました。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
では早速PHPでRedisを使ってみます。
$server = "AWSインスタンスのEndPointを指定します"; $port = 6379; $timeout = 2.5; $redis = new Redis();//redisインスタンスを生成 $redis->connect($server,$port,$timeout);//redisサーバに接続 //基本的にはこれだけで動きます //あとはコマンドを指定してデータを入れるなり取得するなりするだけです //データを追加する場合(新規、上書) $redis->zadd('テーブル名','値','キー'); //順位を値の昇順で取得する場合 $redis->zRank(); //順位を値の降順で取得する場合 $redis->zRevRank(); //キーを値の昇順で指定範囲分取得する場合 $redis->zRange(); //キーを値の降順で指定範囲分取得する場合 $redis->zrevRange(); //データ数を取得する場合 $redis->zCount();
Redisはメモリ内key-valueストアなのでRDBMSよりも高速に動作することが期待できます。
次回は実際にデータを踏まえながら実装部について説明して行きたいと思います。