【问题标题】:Python Redis connection should be closed on every request? (flask)Python Redis 连接应该在每个请求时关闭? (烧瓶)
【发布时间】:2013-08-04 01:42:00
【问题描述】:

我正在使用 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()

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

感谢您的帮助!

【问题讨论】:

  • “更好”有点难以解决,并不是 SO 旨在回答的问题。例如,您的意思是“更快”、“更安全”、“更高效”吗?另外,您是如何使用您的数据库的 - 您将提出什么样的请求,它们是单个指令还是一系列指令?
  • 它非常重要的速度和稳定性。数据库用于存储用户数据,如用户 ID、公钥、私钥等。

标签: python database redis flask


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    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
    

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多