Redis
 sql >> Base de données >  >> NoSQL >> Redis

Quelle est la bonne façon de gérer la connexion Redis dans Tornado ? (Asynchrone - Pub/Sub)

Un peu tard mais j'utilise tornado-redis. Cela fonctionne avec le ioloop de tornado et le tornado.gen modules

Installer tornadoredis

Il peut être installé à partir de pip

pip install tornadoredis

ou avec setuptools

easy_install tornadoredis

mais tu ne devrais vraiment pas faire ça. Vous pouvez également cloner le référentiel et l'extraire. Puis lancez

python setup.py build
python setup.py install

Se connecter à redis

Le code suivant va dans votre main.py ou équivalent

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

redis.connect n'est appelé qu'une seule fois. Il s'agit d'un appel bloquant, il doit donc être appelé avant de démarrer l'ioloop principal. Le même objet de connexion est partagé entre tous les gestionnaires.

Vous pouvez l'ajouter aux paramètres de votre application comme

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

Utiliser tornadoredis

La connexion peut être utilisée dans les gestionnaires comme self.settings['redis'] ou il peut être ajouté en tant que propriété de la classe BaseHandler. Vos gestionnaires de requêtes sous-classent cette classe et accèdent à la propriété.

class BaseHandler(tornado.web.RequestHandler):

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

Pour communiquer avec redis, le tornado.web.asynchronous et le tornado.gen.engine les décorateurs sont utilisés

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}

Informations supplémentaires

Plus d'exemples et d'autres fonctionnalités telles que le regroupement de connexions et les pipelines peuvent être trouvés sur le référentiel github.