2013-08-02 65 views
6

我正在用Redis数据库创建烧瓶应用程序。我有一个连接问题每个请求都应该关闭Python Redis连接? (烧瓶)

我可以有Redis的连接全球,并保持非全封闭时间:

初始化的.py

import os 
from flask import Flask 
import redis 

app = Flask(__name__) 

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

我也可以重新连接每个请求(瓶文档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() 

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

感谢您的帮助!

+0

“更好”是一种很难解决的问题,而不是真正的SO问题。例如,你的意思是“更快”,“更安全”,“更高效”?另外,你如何使用你的数据库 - 你将要做什么样的请求,并且他们是单个指令还是一系列指令? –

+0

它非常重要的速度和稳定性。数据库用于用户数据,如用户ID,公钥,私钥等。 – KiraLT

回答

16

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

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

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

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

此外,如果你有很多的指令在任何时间执行那么它可能是值得拥有看看pipelining,因为这减少了每个指令要求的来回时间。