python中的Redis连接池我做错了什么?

时间:2012-11-06 06:52:53

标签: python redis

这是我正在做的事情。当我这样做时,redis-py会爆炸。

Python 2.7.3 (default, Aug  1 2012, 05:16:07)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import redis
>>> p = redis.ConnectionPool()
>>> r = redis.Redis(connection_pool=p)
>>> p.release(r)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/redis/connection.py", line 355, in release
    if connection.pid == self.pid:
AttributeError: 'Redis' object has no attribute 'pid'
>>>

1 个答案:

答案 0 :(得分:18)

好的,因为没有人回答这个问题,我花了一些时间来完成redis-py源代码(使用源luke!),这就是我找到的。我会在这里分享,以防其他人在将来遇到同样的问题。

返回的Redis()对象
r = redis.Redis(connection_pool=p)

不代表redis连接。它只是一个代理redis API的Python对象。当我们调用特定的API时,比如说

 r.keys() 
,内部代理使用传递的连接池在创建命令和有效负载之前请求连接,并触发从池中获取的连接。然后它将连接返回到池。所有这些操作对API用户都是透明的。

最重要的是,您可以在代码中创建任意数量的redis.Redis()对象,然后将其丢弃。 Python GC将处理对象清理,而connection_pool在Redis()对象之外进行管理。