1

メッセージシステムの一部をredisに入れようとしています。django から redis への接続管理について質問があります。以下はクオラからの抜粋です。

Django (または実際には他の Web フレームワークだと思います) から Redis と対話する場合、興味深い課題は、接続と切断のタイミングを決定することです。Redis へのクエリごとに新しい接続を作成すると、1 つのページ リクエストが何百もの Redis リクエストを作成する可能性があることを考えると、大量の不要なオーバーヘッドになります。スレッド/プロセスで 1 つの接続を開いたままにしておくと、閉じられていない接続が大量に発生し、問題が発生する可能性があります。また、Redis クライアント ライブラリが時折タイムアウト エラーをスローすることも確認しましたが、これは明らかに悪いことです。私が得た最良の結果は、リクエストの開始時に単一の Redis 接続を開き、最後にそれを閉じることでした。これは、Django ミドルウェアで実現できます。この動作を実現するためだけにミドルウェアを追加する必要がありますが、少し汚れているように感じます。

誰もがそのような redis ミドルウェアを作成する機会がありましたか?

4

1 に答える 1

1

ミドルウェアを実装しました:

import redis
from redis_sessions import settings


# Avoid new redis connection on each request


if settings.SESSION_REDIS_URL is not None:
    redis_server = redis.StrictRedis.from_url(settings.SESSION_REDIS_URL)
elif settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH is None:

    redis_server = redis.StrictRedis(
        host=settings.SESSION_REDIS_HOST,
        port=settings.SESSION_REDIS_PORT,
        db=settings.SESSION_REDIS_DB,
        password=settings.SESSION_REDIS_PASSWORD
    )
else:

    redis_server = redis.StrictRedis(
        unix_socket_path=settings.SESSION_REDIS_UNIX_DOMAIN_SOCKET_PATH,
        db=settings.SESSION_REDIS_DB,
        password=settings.SESSION_REDIS_PASSWORD,
    )

class ReddisMiddleWare(object):
    def process_request(self,request):
        request.redisserver = redis_server

次に、ビューで request.redisserver.get(key) を使用しています。

于 2013-09-10T13:15:38.857 に答える