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

viv*_*ekv 2 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'
>>>
Run Code Online (Sandbox Code Playgroud)

viv*_*ekv 19

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

返回的Redis()对象

r = redis.Redis(connection_pool=p)
Run Code Online (Sandbox Code Playgroud)

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

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

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