2011-05-10 15 views
19

Tengo curiosidad por saber cuál es el método recomendado para consultar a Redis (o cualquier DB en este caso) de Tornado.¿Cómo * correctamente * consulta Redis de Tornado?

He visto algunos ejemplos como https://gist.github.com/357306 pero todos parecen estar usando llamadas de bloqueo a redis.

Mi comprensión es que para evitar que Tornado se detenga, necesito usar librerías de DB no bloqueantes como las desarrolladas para Twisted.

¿Estoy equivocado? ¿Cómo se supone que se hará esto?

Respuesta

39

Cuando se trata de bloquear comandos como BLPOP o de escuchar un canal Pub/Sub, necesitará un cliente asíncrono como tornado-redis. Puede comenzar con this demo para ver cómo se puede usar el cliente tornado-redis para desarrollar una aplicación de chat público simple.

Pero yo recomendaría usar el cliente síncrono redis-py junto con hiredis para la mayoría de los otros casos.

La principal ventaja del cliente asíncrono es que su servidor puede manejar las solicitudes entrantes mientras espera la respuesta del servidor Redis. Sin embargo, el servidor Redis es tan rápido que en la mayoría de los casos una sobrecarga de configuración de devoluciones de llamada asíncronas en su aplicación Tornado agrega más tiempo total de procesamiento de solicitudes que el tiempo dedicado a esperar la respuesta del servidor Redis.

Al usar un cliente asíncrono, puede intentar enviar varias solicitudes al servidor Redis al mismo tiempo, pero el servidor Redis es de un solo subproceso (como el servidor Tornado), por lo que responderá a estas solicitudes una- uno por uno y no ganarás casi nada. Y, de hecho, no tiene que enviar múltiples comandos Redis al mismo tiempo al mismo servidor Redis, siempre que haya canalizaciones y comandos como MGET/MSET.

Un cliente asíncrono tiene algunas ventajas cuando se utilizan varias instancias del servidor Redis, pero se sugiere emplear un cliente síncrona (Redis-PY) y un proxy como twemproxy o this one (este último soportes canalización y ordena MGET/MSET).

También sugiero no utilizar la agrupación de conexiones cuando se utiliza el cliente redis-py en las aplicaciones Tornado. Simplemente cree una única instancia de objeto Redis para cada base de datos de Redis a la que se conecte su aplicación.

+2

De hecho, el uso de un cliente síncrono suena bien para el caso promedio, pero el peor caso podría no ser aceptable.Ejemplo 1: si Redis se cuelga o la red a Redis es lenta, se bloqueará la aplicación Tornado. Ejemplo 2: la serialización de solicitudes en el cliente y la serialización en el servidor solo son equivalentes si la latencia de la red es 0, que casi nunca es el caso. –

+0

tornado-redis ya no se mantiene. Pero el repositorio sugiere algunas alternativas: https://github.com/aio-libs/aioredis y https://github.com/mrjoes/toredis – matyas

1

Una opción es usar el port of Tornado to Twisted y luego usar the Twisted Redis API con eso. Tornado en sí mismo no parece tener operaciones asíncronas arbitrarias como objetivo (aunque si quisiera reconstruir todos los tipos de cosas que se han construido para Twisted, probablemente podría compilarlos desde the low-level iostream APIs in Tornado, pero I wouldn't recommend it).

+0

O la implementación del reactor Twisted en la parte superior de Tornado: http://tornado.readthedocs.org/en/latest/twisted.html –

8

Recomendaría utilizar brukva que es un "cliente Redis asíncrono que funciona dentro del bucle Tornado IO".

+11

Por si acaso alguien tropieza con esta publicación, creo que la biblioteca de redis asíncrona más actualizada ahora es tornadoredis https://github.com/leporo/tornado-redis –