我的网站正在使用Django,现在我想将部分逻辑移植到Redis,所以我需要为我的views.py代码建立Redis连接,显然我无法在views.py中编写连接到redis代码因为它可能被多次调用,所以我需要将连接放在django中的某个地方,也许是中间件?
但是我不想让这个复杂,只是MySQL数据库连接的地方,我想为Redis连接添加一个全局对象。也许稍后会出现XMPP和ZeroMQ。
怎么做?
感谢任何想法。在此先感谢:)
答案 0 :(得分:1)
在典型的Django服务器设置中,多个请求将由同一个工作进程处理。
您可以简单地设置一个全局变量来保存在views.py之上的连接并在每个视图函数/类中使用连接,当工作进程启动时建立连接,并在工作进程被回收时关闭。它是半永久性的连接,但足够好。
MySQL连接在Django中的工作方式相同。每个请求不是每个数据库连接,而是每个工作进程的生命周期
答案 1 :(得分:0)
你想要这样做并不明显。你想要这样做的原因并不明显。
那为什么不在views.py中连接?使用单个“全局连接”将意味着添加锁定/序列化代码,以确保您的连接可以安全地用于对视图的多次调用。我实际上在我的各种各样的views.py文件中创建和连接方法。有时我连接到一个或另一个实例。我没有看到任何性能问题,也不必担心并发安全问题。我让雷迪斯想出来了。
全局共享连接的另一个方面是性能下降 - 您将有一个页面视图等待另一个页面视图在它可以运行之前完成。通过允许每个人拥有自己的连接,您可以避免一个视图在等待访问全局连接器时减慢另一个视图。
请考虑这一点:如果您的查询非常小且速度快,以至于您不希望通过序列化访问Redis的每个页面来看到性能损失,那么当您连接时,您不会看到每页连接的性能下降,查询和关闭。我非常怀疑设置连接的成本远远超过连接到Redis的所有页面访问的序列化。
所以我的建议就是尝试一下。当且仅当您看到问题时,您应该担心实施您可能不需要的东西。
答案 2 :(得分:-3)
已经为此提供了很多代码。 http://github.com/andymccurdy/redis-py