每次请求都应该关闭Python Redis连接? (烧瓶)

时间:2013-08-02 17:25:20

标签: python database redis flask

我正在使用Redis数据库创建烧瓶应用。我有一个连接问题

我可以将Redis连接设置为全局并始终保持非关闭状态:

初始化的.py

import os
from flask import Flask
import redis

app = Flask(__name__)

db = redis.StrictRedis(host='localhost', port=6379, db=0)

我也可以重新连接每个请求(Flask doc http://flask.pocoo.org/docs/tutorial/dbcon/):

初始化的.py

import os
from flask import Flask
import redis

app = Flask(__name__)

#code...

@app.before_request
def before_request():
    g.db = connect_db()

@app.teardown_request
def teardown_request(exception):
    db = getattr(g, 'db', None)
    if db is not None:
        db.close()

哪种方法更好?为什么我应该使用它?

感谢您的帮助!

2 个答案:

答案 0 :(得分:19)

默认情况下redis-py使用连接池。 github wiki说:

  

在幕后,redis-py使用连接池来管理与Redis服务器的连接。默认情况下,您创建的每个Redis实例将依次创建自己的连接池。

这意味着对于大多数应用程序而言,假设您的redis服务器与烧瓶应用程序位于同一台计算机上,那么为每个请求“打开连接”不太可能导致任何性能问题。 Redis Py的创建者有suggested this approach

  

一个。创建一个全局redis客户端实例并让您的代码使用它   湾创建一个全局连接池,并将其传递给整个代码中的各种redis实例。

此外,如果您在任何时候都有大量指令要执行,那么可能值得查看pipelining,因为这会减少每条指令所需的来回时间。

答案 1 :(得分:0)

使用Flask,不建议使用全局变量。在请求期间,我们可以使用g管理redis客户端。就像使用工厂模式管理数据库连接一样。

eval()

重新连接每个请求对您来说都更好。

  

应用程序上下文是在请求或CLI命令期间存储公共数据的好地方。 Flask为此提供了g对象。这是一个简单的名称空间对象,与应用程序上下文具有相同的生存期。