web-dev-qa-db-ja.com

Pythonからredisへの接続を管理する

pythonアプリケーションでredis-pyを使用して、Redisデータベースに単純な変数または変数のリストを保存しているため、redisサーバーへの接続を作成する方が良いと考えましたこれはあまり頻繁に行われず、タイムアウトする可能性のある永続的な接続を必要としないため、変数を保存または取得する必要があるたびに。

いくつかの基本的なチュートリアルを読んで、Redisクラスを使用して接続を作成しましたが、Redisを使用するのはこれが初めてなので、接続を閉じる方法を見つけていません。接続を管理するための最良のアプローチを使用しているかどうかはわかりませんので、このためのアドバイスをお願いします。これは私が今変数をsettingまたはgettingしている方法です:

import redis

def getVariable(variable_name):
    my_server = redis.Redis("10.0.0.1")
    response = my_server.get(variable_name)
    return response

def setVariable(variable_name, variable_value):
    my_server = redis.Redis("10.0.0.1")
    my_server.set(variable_name, variable_value)

私は基本的にこのコードを使用して、最後の接続時間を保存したり、アプリやそのようなものに対して行われた1秒あたりの平均リクエスト数を取得します。

アドバイスをしてくれてありがとう。

44
jeruki

Pythonはオブジェクトを処理するために参照カウンターメカニズムを使用するため、ブロックの最後で、my_serverオブジェクトは自動的に破棄され、接続が閉じられます。明示的に閉じる必要はありません。

これは、Redis接続の管理方法ではありません。各操作の接続/切断は高すぎるため、接続を開いたままにしておくことをお勧めします。 redis-pyでは、接続のプールを宣言することで実行できます。

import redis

POOL = redis.ConnectionPool(Host='10.0.0.1', port=6379, db=0)

def getVariable(variable_name):
    my_server = redis.Redis(connection_pool=POOL)
    response = my_server.get(variable_name)
    return response

def setVariable(variable_name, variable_value):
    my_server = redis.Redis(connection_pool=POOL)
    my_server.set(variable_name, variable_value)

接続プールの管理はほとんど自動的に行われ、redis-py内で行われます。

71
Didier Spezia

@ sg1990同時にredisを必要とする10.000人のユーザーがいる場合はどうなりますか?単一の接続を共有することはできず、ボトルネックを作成したばかりです。

接続のプールを使用すると、任意の数の接続を作成し、 redis-py docsget_connection()およびrelease()を使用できます。

すべての接続でオープンソケットを維持する必要があるため、ユーザーごとの接続は非常に過剰です。この方法では、自動的に数を減らします。マシンが半分まで処理できる同時Websocketユーザー。

2
haren