1

我正在尝试将一些消息系统放入redis。我有一个关于从 django 到 redis 的连接管理的问题。以下摘自quora:

当从 Django(或者实际上任何其他 Web 框架,我想)与 Redis 交谈时,一个有趣的挑战是决定何时连接和断开连接。如果您为每个到 Redis 的查询建立新连接,考虑到单个页面请求可能会产生数百个 Redis 请求,这将产生大量不必要的开销。如果您在线程/进程中保持一个连接打开,您最终会得到大量未关闭的连接,这可能会导致问题。我还看到 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 回答