エンジニア

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

投稿日:2013年10月4日 更新日:

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

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

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

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

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

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-

© WonderPlanet Inc.