python - 在 Python 中管理 redis 连接

标签 python redis connection singleton

我已经回答了关于这个主题的多个问题,但我仍然感到困惑。我正在尝试找到在多个 Python 模块之间共享数据库连接的最佳方式。我也看过 Borg 模式,但看不出它在我们需要共享数据库连接时有何用处。

这是我所拥有的: 我正在使用 Redis 作为我的数据库,并希望在多个模块之间共享一个 redis 连接。

选项 1:正如下面 Jared 所建议的,我可以只创建一个 redis 连接并将其传递到任何地方。

class Crawler:
    def __init__(self, url_store):
        self._url_store = url_store


class UrlStore:
    def __init__(self, redis_client):
        self._redis_client = redis_client


if __name__ == '__main__':
    redis_client = redis.StrictRedis(host='localhost',
                                     port=6379,
                                     db=0,
                                     decode_responses=True)

    url_store = UrlStore(redis_client)
    c = Crawler(url_store)

选项 2:将 redis 连接包装在一个类中。

  class RedisConnection:
    client = redis.StrictRedis(host='localhost',
                               port=6379,
                               db=0,
                               decode_responses=True)


class Crawler:
    def __init__(self, url_store):
        self._url_store = url_store


class UrlStore:
    def __init__(self):
        self._redis_client = RedisConnection.client


if __name__ == '__main__':

    url_store = UrlStore()
    c = Crawler(url_store)

使用选项 1,无需担心单例等问题,但我认为我们正在到处泄露数据库信息。

选项 2 感觉不太优雅。

我认为这里有一个更大的设计问题..这是..是否应该在需要的地方“注入(inject)”数据库连接...或者..是否应该根据需要从全局/单一/共享状态访问它?

最佳答案

只是一个想法,创建一个数据库实例池。说三/五。 并有一个 dbPool 字典

     dbPool = {client _inst1 = 0, client _inst2 = 0, client _inst3 = 0}

key -> db instance, value -> 0/1 (0- dbconn free, 1 dbconn inuse)

每当你需要一个实例有一个小的线程安全 fn:

def getThreadSafeConnection(self) :
    for dbConn, value in self.dbPool.items() :
        if value == 0 :
            self.lock() # lock
            self.dbPool[dbConn] = 1 # db cursor in use 
            self.unlock()
            return dbConn
    return createNewConn() // if no dbConn is free

执行查询后重置 dbInstance 标志

            self.lock()
            self.dbPool[dbConn] = 0 # db cursor is free
            self.unlock()

这将确保正确执行查询。如果您觉得可能会发生更多的数据库命中,请增加您的 dbPool 大小。

关于python - 在 Python 中管理 redis 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648462/

相关文章:

python - 在 Keras Lambda 层中调整输入图像的大小

django - 具有多个 django 站点的 celery

node.js - Redis 和 docker-compose 连接 127.0.0.1 :6379

python - 如何将 pandas.core.series.Series 类型转换为二维数组?

python - 如何展开基于键值 "pairs"的 python 列表字典?

Spring RedisTemplate : use same key with multiple RedisTemplate to store different values

mysql - 无法更改 mysql 连接限制

http - JavaME Midlet 无法建立 HTTP 连接

ssis - 如何修复SSIS中的 "[OData Source [56]] Error: Cannot acquire a managed connection from the run-time connection manager."错误?

python - 使用 Pandas 的宽到长数据集