在Heroku上使用Redis

以前の記事(MacでRedis)で作ったプログラムをherokuで動かしてみます。
heroku自体は利用できることを前提としてます。

程序结构

    • tree コマンドの結果はこんな感じです。

 

    virtualenvの環境も一緒にはいってます。
.
├── Procfile
├── __pycache__
├── app.py
├── bin
├── include
├── lib
├── pip-selfcheck.json
├── requirements.txt
└── runtime.txt

要求文件

    • 必要なライブラリを記述してます。

pip freeze > requirements.txtでできます。
具体的には、下記のようになってます。

click==6.7
Flask==0.12.2
gunicorn==19.7.1
itsdangerous==0.24
Jinja2==2.9.6
MarkupSafe==1.0
redis==2.10.5
Werkzeug==0.12.2

运行时文本

    • 稼働させるpythonのバージョンを記述します。

 

    具体的には、下記のようになってます。
python-3.6.0

进程文件

    • herokuのwebサーバはgunicornを使用するので設定ファイルを記述します。

 

    • 具体的には、下記のようになってます。

 

    app.pyなので、app:appてなっちゃうのでわかりずらいですねw
web: gunicorn app:app --log-file -

Heroku Redis – 弘元 Redis

请注意!

    • herokuの無料コースで試せますが、redisを使うためには認証のためにクレカの登録が必要です。

 

    redisのプラグインも無料コースを選べます。

插件的配置

    heroku cliを使います。Webのコンソールでもできます。
% heroku plugins:install heroku-redis                                                                                Installing plugin heroku-redis... done
    プラグインを追加するとredisが使えるようになってます。
% heroku config -a APP_NAME
=== APP_NAME Config Vars
LANG:      ja_JP.utf8
REDIS_URL: redis://h:pc16fb4fb5781c56263fe9b8ac2〜〜〜2980da@ec2-34-〜〜〜.compute-1.amazonaws.com:9289
TZ:        Asia/Tokyo
    LANGとTZは別に設定しました。REDIS_URLという環境変数がポイントですね。

源代码

    環境変数がなければデフォルト値でローカルマシンにも対応するようにしてます。
import os
import sys
import redis
import random
from flask import Flask
from datetime import datetime as dt

app = Flask(__name__)

# 接続パス、環境変数にあればそれ優先
REDIS_URL = os.environ.get('REDIS_URL') if os.environ.get(
    'REDIS_URL') != None else 'redis://localhost:6379'
# データベースの指定
DATABASE_INDEX = 1  # 0じゃなくあえて1
# コネクションプールから1つ取得
pool = redis.ConnectionPool.from_url(REDIS_URL, db=DATABASE_INDEX)
# コネクションを利用
r = redis.StrictRedis(connection_pool=pool)

@app.route('/')
def root():
    return '{"status":"OK"}'

@app.route('/get')
def get():
    n = random.randrange(len(r.keys()))
    key = r.keys()[n]
    return str(r.get(key))

@app.route('/set')
def set():
    tdatetime = dt.now()
    key = tdatetime.strftime('%Y-%m-%d %H:%M:%S')
    r.set(key, {'val': key})
    return '{"action":"set"}'

if __name__ == '__main__':
    app.run(threaded=True)

广告
将在 10 秒后关闭
bannerAds