WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

AWSのElastiCache(Redis)を使ってリアルタイムランキングを実装する(その1)

今回のブログを担当する中村です。

今日は「リアルタイムランキング」の実装について書こうと思います。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

モバイルソーシャルゲームにおいて「リアルタイムランキング」の需要は大きいと言えます。

その理由はソーシャル性のUPが図れるからです。

例えば、LINEPOPでランキングが上がった(他のユーザーを追い越した)とき、自慢する機能がありますが、もし「リアルタイムランキング」でなかったらどうなるでしょうか?LINEを介して届いたメッセージを見て、LINEPOPを起動してみたら「ランキングは30分毎に反映されます」ということで追い抜いた情報が反映されていない。これでは臨場感がありませんね?

しかし「リアルタイムランキング」をDBサーバへのリクエストで実装しようとすると負荷がかかりすぎます。

そこでDBに負荷をかけず、簡単に「リアルタイムランキング」を実装方法としてRedisを利用する方法があります。

Redisは「remote dictionary server」の略でオープンソースのkey-valueデータストアです。

同様のものとしてmemcachedが存在しますが、
Redisはmemcachedと違い、value部分がデータ構造をしています。
(単に文字列、数値だけを保存するのではなくリスト型なども保存できる)

それにより、より自由なデータ管理が可能です。

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

今回は最近AWSのElastiCacheでRedisが使えるようになったこともあり、AWSでRedisを使ってみたいと思います。

スクリーンショット 2013-10-04 21.54.05

AWSのElastiCacheメニューから新しいインスタンスをLaunchします。

AWS_ElasticCache2

今まで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よりも高速に動作することが期待できます。
次回は実際にデータを踏まえながら実装部について説明して行きたいと思います。