Соединение Python Redis должно быть закрыто по каждому запросу? (колба)

Я создаю приложение колбы с базой данных Redis. И у меня есть один вопрос о связи

Я могу иметь соединение Redis глобальное и держать не закрытым все время:

init.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/):

init.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 ответов


по умолчанию redis-py использует пул соединений. The гитхаб Вики говорит:

за кулисами redis-py использует пул соединений для управления подключениями к серверу Redis. По умолчанию каждый созданный экземпляр Redis будет в свою очередь создавать собственный пул соединений.

Это означает, что для большинства приложений и предполагая, что ваш сервер redis находится на том же компьютере, что и ваше приложение flask, маловероятно, что " открытие соединения" для каждого запроса будет вызывать какие-либо проблемы с производительностью. Создатель Redis Py имеет предложил этот подход:

a. создайте глобальный экземпляр клиента redis и используйте его в коде.
b. создайте глобальный пул соединений и передайте его различным экземплярам redis по всему коду.

кроме того, если у вас есть много инструкций для выполнения в любой момент времени, то, возможно, стоит взглянуть на конвейеризация поскольку это уменьшает время, необходимое для каждой инструкции.


через колбу, глобальные переменные не рекомендуется. Мы можем использовать g для управления клиентом redis во время запроса. Например, управление подключением к базе данных с помощью шаблона factory.

from flask import g
import redis

def get_redis():
    if 'db' not in g:
        g.db = redis.Redis(host='localhost', port=6379, db=0)
    return g.db

Reconnect каждый запрос лучше для вас.

контекст приложения является хорошим местом для хранения общих данных во время запроса или команды CLI. Колба обеспечивает объект g для этой цели. Это простой объект пространства имен, который имеет то же время жизни, что и приложение контекст.