2012-05-20 9 views
8

Deseo poder ejecutar una devolución de llamada cuando se realiza algún cambio en mi colección redis. La devolución de llamada tomaría la clave y el valor como entradas. Es algo como esto posible?¿Escuchas cambios en Redis?

Gracias?

+0

relacionada Pedido de funciones: https://github.com/antirez/redis/issues/83 –

Respuesta

8

También puede conectarse al servidor Redis como un Esclavo utilizando el comando sync. Vea cómo Redis Replication Works? para una introducción rápida.

La salida del comando de sincronización tiene dos fases. En la primera fase, el servidor devuelve el archivo dump.rdb de la base de datos. Una vez que se envía el archivo, comienza a enviar comandos en el protocolo Redis, que también es el formato AOF.

Aquí está la foto de nivel alto de lo que puede hacer:

  1. Conectar con el servidor Redis y ejecute el comando SYNC
  2. Guardar y analizar el archivo dump.rdb. Construye el conjunto de datos inicial. A node.js based rdb parser está disponible
  3. Analice los comandos que siguen. Como están en el protocolo Redis, puede comenzar con una biblioteca existente de Redis.
  4. Para cada comando que recibe, invocar una devolución de llamada

Parece mucho trabajo, pero usted debería ser capaz de cortar este con bastante facilidad. ¡Y también sería una buena biblioteca de código abierto!

EDIT: sincronización v/s monitor

  1. Monitor es un comando de depuración. El formato de respuesta puede (y tiene) cambiar (d) a lo largo del tiempo. Sync se utiliza para la replicación Master -> Slave, por lo que será mejor compatible
  2. Monitor emitirá todos los comandos, incluidos los comandos de solo lectura. Sync solo obtendrá comandos que modifiquen datos.
  3. Monitor registrará comandos individuales que se ejecutan dentro de una secuencia de comandos lua.Sync solo transferirá la secuencia de comandos lua completa, por lo que tendrá que analizar el script usted mismo. Este es de hecho un factor decisivo para sync.
  4. Monitor registrará los comandos que no tuvieron éxito, Sync solo registrará los comandos que modifican los datos. Por ejemplo, el comando del non-existing-key se registrará en el monitor, pero no se mostrará cuando ejecute la sincronización.
+0

Sripathi! ¿Podría darme una descripción general de alto nivel de este vs usando el monitor para las actualizaciones? – fancy

+1

@fancy ver actualizaciones de mi respuesta –

10

dos opciones:

  1. Use MONITOR comando - traza cada comando que llega a Redis y se puede analizar y ver cuando está siendo tocado su colección.

  2. Si "posee" el código que escribe en la colección, señale su otro código (su devolución de llamada). Puede usar el canal Redis Pub/Sub para esto.

EDITAR Redis es en realidad va a implementar esta característica en la versión 2.8. Ver la publicación de blog de Antirez en esto: Redis keyspace changes notification system.

+0

@fancy ver cambios a mi respuesta Gracias –

3

respuesta corta - no.

respuesta un poco más larga: puede hacerlo solo si agrega publicación a un canal específico en redis PubSub en su cliente. o el usuario MONITOR para analizar lo que sea que esté pasando en redis, pero si ese proceso pierde conexión con redis, estás jodido.

0
<dependency> 
    <groupId>com.moilioncircle</groupId> 
    <artifactId>redis-replicator</artifactId> 
    <version>2.5.0</version> 
</dependency> 

Si está utilizando Java. redis-replicator implementa el protocolo de replicación de redis. Más detalles, consultar references

0

En 2017

Ahora hay un mecanismo de publicación/suscripción que se puede utilizar con node-redis módulo. Consulte la documentación específica HERE. (También funciona con redis-mock para probar)

Puede tener varios suscriptores (oyentes) en el mismo canal, que en su caso sería la clave de su colección.

muestra rápida: (ver arriba documentación para detalles de implementación)

sub.subscribe('myCollection'); 
sub.on('message', (channel, data) => { 
    // this is the callback you talked about 
    console.log(`${channel} is now ${data}`); 
}); 

// ... later on ... 

pub.publish('myCollection', [1,2,3]) 
// console will output: 
// myCollection is now [1,2,3]