Соединение 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 для этой цели. Это простой объект пространства имен, который имеет то же время жизни, что и приложение контекст.