【问题标题】:Multiple permanent connection for Django?Django的多个永久连接?
【发布时间】:2011-07-28 04:05:14
【问题描述】:
我的网站正在使用 Django,现在我想将部分逻辑移植到 Redis,所以我的 views.py 代码需要 Redis 连接,显然我无法在 views.py 中编写连接到 redis 代码因为它可能会被多次调用,所以我需要将连接放在 django 中的某个地方,也许是中间件?
但是我不想把这个复杂化,只是在连接MySQL数据库的地方,我想为Redis连接添加一个全局对象。 XMPP conenction 和 ZeroMQ 可能会晚些。
如何做到这一点?
任何想法都值得赞赏。在此先感谢:)
【问题讨论】:
标签:
django
connection
redis
【解决方案1】:
在典型的 Django 服务器设置中,多个请求将由同一个工作进程处理。
您可以简单地在views.py之上放置一个全局变量来保存连接,并在每个视图函数/类中使用连接,连接将在工作进程启动时建立,并在工作进程被回收时关闭。这是半永久连接,但足够好。
MySQL 连接在 Django 中的工作方式相同。这不是每个请求的每个数据库连接,而是每个工作进程的生命周期
【解决方案2】:
你想这样做并不明显。您为什么要这样做并不明显。
那么为什么不在views.py 中连接呢?使用单个“全局连接”意味着添加锁定/序列化代码,以确保您的连接在对视图的多次调用中可以安全使用。我实际上在我的各种和杂项views.py文件中的方法中创建和连接。有时我会连接到一个或另一个实例。我没有看到任何性能问题,也不必担心并发安全。我让 Redis 解决这个问题。
全局共享连接的另一个方面是性能下降 - 您将有一个页面视图等待另一个页面视图完成,然后才能运行。通过允许每个视图拥有自己的连接,您可以避免一个视图在等待访问全局连接器时拖慢另一个视图。
请考虑一下:如果您的查询非常小而且非常快,以至于您不希望看到序列化访问 Redis 的每个页面会导致性能下降,那么您在连接时不会看到每个页面的连接有任何性能下降、查询和关闭。我非常怀疑设置连接的成本远远超过序列化连接到 Redis 的所有页面访问。
所以我的建议是尝试一下。当且仅当您发现问题时,您才应该担心实施您可能不需要的东西。