PythonとRedisを使ってAlibabaクラウド上にゲームリーダーボードを構築

このガイドでは、**Python**と**Redis**を使って**Alibaba Cloud**上にゲームリーダーボードを構築していきます。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/building-game-leaderboards-with-redis-on-alibaba-cloud_593849)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#目的
このデモの主なアイデアは、ゲームアプリケーションでリーダーボードを生成するためにデータベースを叩くのではなく、キャッシュ層（Redis）を使用することです。このアプローチは、リアルタイムの応答を必要とする大規模なデータベースに適しています。

#前提条件
必須ではありませんが、Pythonの基本的な理解があることはプラスになります（サンプルコードはPythonです）。今回はRedisを活用しているので、Redisがどんなものなのかを知るためにも読んでおくと良いでしょう。

Alibaba CloudでのRedisクラスタの作成については、[このガイド](https://www.alibabacloud.com/help/ja/doc-detail/26351.htm)で別途ステップバイステップのコマンドを読んで、それに沿って進めていけばいいので、ここでは割愛します。設定は簡単でわかりやすいです。

#実施の様子
1、[Elastic Compute Service(ECS)](https://www.alibabacloud.com/help/ja/doc-detail/25424.htm)と[ApsaraDB for Redis](https://www.alibabacloud.com/help/ja/doc-detail/26351.htm)のセットアップを行います。このチュートリアルでは、OSとしてUbuntu 16.04を使用していますが、ソリューション自体はどのOSでも可能です。選択したOSによってコードが若干異なる場合があります。
2、ECSサーバにログインします。

```
ssh -i  root@
```

3、環境をインストールするための手順を実行します。

```
rm /usr/bin/python # Change python into version 3
ln -s /usr/bin/python3 /usr/bin/python
apt-get update # Update Ubuntu
export LC_ALL=C # Set Locale
apt-get install python3-pip # Install pip
pip install redis # Install python-redis
apt-get install apache2 # Install apache
mkdir /var/www/python # Set Environment
a2dismod mpm_event
a2enmod mpm_prefork cgi
```

4、etc/apache2/sites-enabled/000-default.conf を置き換えます。

```
-----
<VirtualHost *:80>
        DocumentRoot /var/www/python
        <Directory /var/www/python>
                Options +ExecCGI
                DirectoryIndex leaderboards.py
        </Directory>
        AddHandler cgi-script .py
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
-----
```

5、そのファイルを/var/www/leaderboards.pyに置き、8行目の設定を編集します（以下のソースコード）。
6、ファイル内のパーミッションを編集します。

```
chmod 755 /var/www/python/leaderboards.py
```

7、Apache を再起動します。

```
service apache2 restart
```

8、ウェブブラウザにアクセスして、パブリックIPアドレスを入力してください。それが動作しているかを見る必要があります。

#コード説明
以下はPythonでのコードサンプルですが、これについてはさらに説明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/750707cf-e5f9-1bef-0eed-30c28b5116b5.png)


コードの説明:
1、Redisに接続します（8行目）：

```
r = redis.StrictRedis(host='', port=6379, db=0, password='') 
```

これを正しく動作させるためには、ホスト名とパスワードを更新する必要があります。ApsaraDB for Redisの作成時に「接続アドレス」から取得できます。作成時に設定したパスワードでもあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/e4ec668e-1406-39ad-2bf8-f2ce5330cab9.png)

2、リーダーボードにスコアを追加します(16行目)

```
r.zincrby(leaderboardName, gamer, random.randint(1,1000000)) 
```

LeaderboardName はリーダーボードの名前に設定するキー、gamer はゲーマーのユーザー名または ID、最後のパラメータはスコアを入れる場所です (この場合は乱数です)。

3、最高スコアのトップ10を取得します（19行目）。

```
r.zrange(leaderboardName, 0, 9, desc=True, withscores=True)
```

LeaderboardNameはリーダーボードの名前を設定するキーで、2番目のパラメータはどのランクから開始するか(0が開始)、3番目のパラメータはどこで停止するか(-1で最後まで表示する)です。値desc=Trueは、リーダーボードを降順にソートします(デフォルトではFalse)。

4、現在のプレイヤーの順位を取得します (30行目)。

```
r.zrevrank(leaderboardName, gamer)+1
```

LeaderboardNameはリーダーボードの名前に設定するキーで、gamerはゲーマーのユーザー名またはIDです。データベースではランクは1ではなく0から始まるので、1つ(+1)を追加する必要があります。
5、現在のプレイヤー（または誰でも）のスコアを取得します（34行目）。

```
r.zscore(leaderboardName, gamer) 
```

LeaderboardNameはリーダーボードの名前に設定するキーで、gamerはゲーマーのユーザー名またはIDです。

#コードを実行する
以下は、ウェブサーバ上でコードを実行したときの期待されるレスポンスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/f3a589ca-8897-b14f-1046-235b53aea81f.png)

#結論
Redisはデータをインメモリで保存し、製品の成熟度によって毎秒数百万リクエストのパフォーマンスに達することができます。このため、このユースケースやその他のキャッシングニーズに最適なデータベースとなっています。

Alibaba Cloud上のRedisの詳細については、[ApsaraDB for Redis](https://www.alibabacloud.com/ja/product/apsaradb-for-redis)のページを参照してください。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*