2013-08-02 63 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,因爲這減少了每個指令要求的來回時間。