GCP Redis の操作

GCP の Redis を操作していく。

前回、Redis インスタンスを作成することができた。

続いて、Redis インスタンスにデータをキャッシュできるか確認しようと思う。ここでは Python のプログラムを作成して、Redis の動作確認を行う。

前回はこちら→GCPを始める ~Cloud Memorystore for Redis~

前提条件

  • VPC ネットワークを事前に作成していること。 f:id:saito_shion:20200316144459p:plain
  • ファイアウォール ルールを事前に作成していること。 f:id:saito_shion:20200316144638p:plain
  • VM インスタンスを事前に作成していること。
    ※[ネットワーク インタフェース] には、app-networkを設定してください。 f:id:saito_shion:20200316144902p:plain

Redis の準備

VM インスタンスと同じリージョンで、Redis インスタンスを作成する。
※[承認済みネットワーク] にはapp-networkを設定してください。 f:id:saito_shion:20200316145735p:plain

VM インスタンスの準備

下記のコマンドを実行してインストールを行う。

$ sudo yum install python3
$ sudo pip3 install flask redis

アプリケーションファイルを作成する。

$ touch app.py

下記をapp.pyコピーアンドペーストする。
※ホストは、Redis インスタンスの IP アドレスを指定してください。

import time
import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='your redis ip address', port=6379)
cache_ttl = 5

def get_hit_count():
    retries = 5
    while True:
        try:
            hits:str = cache.get('hits')
            if not hits:
                hits = '0'

            new_value = int(hits) + 1

            pipe = cache.pipeline()
            pipe.set('hits', new_value)
            pipe.expire('hits', cache_ttl)
            pipe.execute()

            return cache.get('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)

@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {0} times.'.format(int(count))

環境変数を設定する。

$ export FLASK_APP=app.py
$ export FLASK_RUN_HOST=0.0.0.0

FLASK を実行する。

$ flask run

動作確認

WebブラウザVM インスタンスのポート5000へアクセスする。 f:id:saito_shion:20200316152853p:plain 画面を更新するごとに、アクセス回数が1増えるようになっている。 また、Redis の TTL を5秒に設定しているため、5秒後にアクセスすると1から再カウントされる。

終わりに

Redis は簡単に利用できることがわかった。

ただ、キャッシュだけではデータが消えてしまうため、永続化するために Bigtable にも挑戦していこうと思う。