【问题标题】:Suggested way how to implement redis connection management in Django如何在 Django 中实现 redis 连接管理的建议方法
【发布时间】:2023-03-07 14:10:01
【问题描述】:

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

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

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

【问题讨论】:

标签: django redis django-middleware


【解决方案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) 。

【讨论】:

    猜你喜欢
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    相关资源
    最近更新 更多