2016-11-21 8 views
0

私はredisと相互作用するフラスコアプリケーションを開発中です。このアプリケーションは英雄の上に配置され、赤目が追加されます。redis get関数returnなし

私はインタラクションでいくつかのテストを行っていますが、私が設定したキー値のペアを取得することはできません。代わりに、私は常に戻り値の型としてNoneを取得します。ここでの例である:

import Flask 
    import redis 


    app = Flask(__name__) 
    redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379') 
    redis = redis.from_url(redis_url) 

    @app.route('/test') 
    def test(): 
     redis.set("test", "{test1: test}") 
     print redis.get("test") # print None here 
     return "what the freak" 


    if __name__ == "__main__": 
     app.run(host='0.0.0.0') 

上記のように、Noneを印刷しないであろうテスト経路は、値が設定されていないことを意味します。私は混乱しています。私がローカルブラウザ上でサーバをテストするとき、それは動作し、herokuのpythonシェルを使ってredisとやり取りを試みたときにも動作します。 Pythonシェルと

テスト:

heroku run python 
from server import redis 
redis.set('test', 'i am here') # return True 
redis.get('test') # return i am here 

私は今、混乱しています。 Flaskを使ってredisと正しく対話する方法は?

答えて

0

これについてさらに実験を行いました。遅れに関連する問題があるようです。以下の変更はそれを動作させます:

@app.route('/test') 
    def test(): 
     redis.set("test", "{test1: test}") 
     time.sleep(5) # add the delay needed to the let the set finish 
     print redis.get("test") # print "{test1: test}" here 
     return "now it works" 

私はredisのドキュメントを読んで、redisはシングルスレッドと思われます。だから、私はset関数が完了する前にget関数呼び出しをなぜ実行するのか不明です。より多くの経験を持つ方は説明を投稿してください。

1

Redis-pyはデフォルトでConnectionPoolクライアントを作成します。これはおそらくfrom_urlヘルパー機能が実行しているものです。 Redis自体はシングルスレッドですが、接続プールからのコマンドの実行順序は保証されていません。単一のクライアントの場合は、redis.StrictRedisクライアントを直接構築するか、またはパラメータconnection_pool=noneを渡します。これは、接続管理のオーバーヘッドが少ないため、単純なコマンドでは数が少なくて済みます。または、接続プールのコンテキストでパイプラインを使用して、バッチ操作をシリアル化することもできます。

https://redis-py.readthedocs.io/en/latest/#redis.ConnectionPool

https://redis-py.readthedocs.io/en/latest/#redis.Redis.pipeline