sql >> Base de Datos >  >> NoSQL >> Redis

¿Cuál es la forma correcta de manejar la conexión Redis en Tornado? (Asíncrono - Pub/Sub)

Un poco tarde pero he estado usando tornado-redis. Funciona con ioloop de tornado y tornado.gen módulo

Instalar tornadoredis

Se puede instalar desde pip

pip install tornadoredis

o con herramientas de configuración

easy_install tornadoredis

pero realmente no deberías hacer eso. También puede clonar el repositorio y extraerlo. Entonces corre

python setup.py build
python setup.py install

Conectarse a redis

El siguiente código va en su main.py o equivalente

redis_conn = tornadoredis.Client('hostname', 'port')
redis_conn.connect()

redis.connect se llama solo una vez. Es una llamada de bloqueo, por lo que debe llamarse antes de iniciar el ioloop principal. El mismo objeto de conexión se comparte entre todos los controladores.

Puede agregarlo a la configuración de su aplicación como

settings = {
    redis = redis_conn
}
app = tornado.web.Application([('/.*', Handler),],
                              **settings)

Usar tornadoredis

La conexión se puede usar en controladores como self.settings['redis'] o se puede agregar como una propiedad de la clase BaseHandler. Sus controladores de solicitudes subclasifican esa clase y acceden a la propiedad.

class BaseHandler(tornado.web.RequestHandler):

    @property
    def redis():
        return self.settings['redis']

Para comunicarse con redis, el tornado.web.asynchronous y el tornado.gen.engine se utilizan decoradores

class SomeHandler(BaseHandler):

    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self):
        foo = yield gen.Task(self.redis.get, 'foo')
        self.render('sometemplate.html', {'foo': foo}

Información adicional

Se pueden encontrar más ejemplos y otras características como agrupación de conexiones y canalizaciones en el repositorio de github.