2012-01-24 18 views
8

Estoy usando Redis para almacenar dos bases de datos: 0 y 1 a través de la biblioteca del cliente Redis-py. Me gustaría crear dos conexiones para cada base de datos. Actualmente, estoy haciendo esto:Crear y administrar conexiones múltiples en Redis Python

>>> connection0 = redis.Connection(host = 'localhost', port = 6379, db = 0) 
>>> connection1 = redis.Connection(host = 'localhost', port = 6379, db = 1) 
>>> connection0.connect() 

Sin embargo, no me parecen encontrar una manera de crear un objeto Redis de la conexión.

>>> store0 = redis.Redis(connection0) 
>>> store0.info() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/client.py", line 341, in info 
    return self.execute_command('INFO') 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/client.py", line 278, in execute_command 
    connection.send_command(*args) 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 258, in send_command 
    self.send_packed_command(self.pack_command(*args)) 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 241, in send_packed_command 
    self.connect() 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 187, in connect 
    sock = self._connect() 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/site-packages/redis-2.4.11-py2.7.egg/redis/connection.py", line 198, in _connect 
    sock.connect((self.host, self.port)) 
    File "/Library/Frameworks/Python.framework/Versions/7.0/lib/python2.7/socket.py", line 224, in meth 
    return getattr(self._sock,name)(*args) 
TypeError: coercing to Unicode: need string or buffer, Connection found 

¿Estoy cometiendo un error de novato aquí?

Respuesta

10

Realmente no debería crear conexiones como esa. Permítanme citar la documentación de redis-py.

Detrás de escena, redis-py usa un conjunto de conexiones para administrar conexiones a un servidor Redis. De forma predeterminada, cada instancia de Redis que cree creará a su vez su propio grupo de conexiones. Puede sobrescribir este comportamiento y utilizar un grupo de conexiones existente pasando una instancia de grupo de conexiones ya creada al argumento connection_pool de la clase Redis. Puede optar por hacer esto para implementar sharding del lado del cliente o tener un control de grano más fino de cómo se administran las conexiones .

>>> pool = redis.ConnectionPool(host='localhost', port=6379, db=0) 
>>> r = redis.StrictRedis(connection_pool=pool) 

No se puede especificar una única conexión para ser utilizado con la biblioteca. Cada instancia de Redis tendrá su propio grupo de conexiones. Cuando se llama a execute_command(), abrirá una conexión desde un grupo (o abrirá uno nuevo) y usará esa conexión. Si solo desea que su cliente tenga una conexión máxima a la vez, establezca max_connections en 1.

Cuestiones relacionadas