Redis py:何时使用连接池?

10
pool = redis.ConnectionPool(host='10.0.0.1', port=6379, db=0)
r = redis.Redis(connection_pool=pool)

对比。

r = redis.Redis(host='10.0.0.1', port=6379, db=0)

这两个工作得很好。

使用连接池的背后思想是什么?何时需要使用它?

2个回答

6

redis-py文档中得知:

在后台,redis-py使用连接池来管理与Redis服务器的连接。默认情况下,每个创建的Redis实例都将创建自己的连接池。您可以通过将已经创建的连接池实例传递给Redis类的connection_pool参数来覆盖此行为并使用现有的连接池。您可能选择这样做是为了实现客户端分片或更精细地控制如何管理连接。

因此,通常情况下,这不是您需要自己处理的事情,如果您需要处理,则说明您已经了解了!


我读了那个文档,但仍然感到困惑,或者说我不明白为什么要使用它,当你可以通过主机/端口/数据库实例化StrictRedis。难道这只是为了避免在需要实例化大量StrictRedis实例时重复输入吗? - ealeon
不,这取决于你是否需要管理连接池。也许您有特定的设置、受限资源或需要针对某些特殊情况进行优化的用例,或者如文档中的示例一样,您想实现客户端分片。 - Linus Thiel
好的,也许我对这些概念没有清晰的理解。我不知道为什么在没有使用连接池的情况下,你不能指定主机来进行客户端分片。抱歉我没有理解清楚。有没有一些好的教程或文档可以让我学习? - ealeon
1
也许你并不需要这样做。你可以将其视为在客户端和服务器之间插入行为的入口点。也许你有很多redis服务器,其中一个充当主服务器,其他服务器则是从服务器。那么,你可以编写自己的连接池类来向从服务器发出读取命令,并向主服务器发出写入命令。当然,你也可以像你建议的那样,在客户端/服务器之间使用分片,但如果你不想这样做,你也可以在自定义连接池中实现分片。 - Linus Thiel

0
默认情况下,您创建的每个Redis实例都会创建自己的连接池。您可以通过将已创建的连接池实例传递给Redis类的connection_pool参数来覆盖此行为并使用现有的连接池。
示例:
class RedisConnection:
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            pool = redis.ConnectionPool(host='******', password='*****', port=*****, db=0)
            cls.instance = redis.Redis(connection_pool=pool)
            return cls.instance
    
obj_1=RedisConnection()
print(id(obj_1))

obj_2=RedisConnection()
print(id(obj_2))

redis connectionpooling python


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接