建议如何在Django中实现redis连接管理

时间:2013-09-09 19:53:42

标签: django redis django-middleware

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

当我从Django(或者其他任何其他网络框架,我想象)与Redis交谈时,一个有趣的挑战是决定何时连接和断开连接。 如果为Redis的每个查询建立新连接,那么考虑到单个页面请求可能会产生数百个Redis请求,这会产生大量不必要的开销。 如果在线程/进程中保持一个连接打开,则最终会出现大量未关闭的连接,从而导致出现问题。我还看到Redis客户端库偶尔会抛出超时错误,这显然很糟糕。 我得到的最好结果是在请求开始时打开一个Redis连接,然后在结束时关闭它 - 这可以通过Django中间件实现。虽然为了获得这种行为而必须添加一块中间件,但感觉有点脏。

有没有人有机会创建这样的redis中间件,我总是赞成不重新发明轮子,但在谷歌没有找到与此主题相关的任何内容。

1 个答案:

答案 0 :(得分: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)。