【问题标题】: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) 。