2012-05-20 20 views
8

Desidero essere in grado di eseguire una richiamata quando vengono apportate modifiche alla mia raccolta redis. Il callback avrebbe preso la chiave e il valore come input. È possibile qualcosa del genere?Ascoltare le modifiche in Redis?

Grazie?

+0

Caratteristica relativa richiesta: https://github.com/antirez/redis/issues/83 –

risposta

8

È anche possibile connettersi al server Redis come uno slave utilizzando il comando sync. Vedi Come Redis Replication Works? per una rapida introduzione.

L'output del comando sync ha due fasi. Nella prima fase, il server restituisce il file dump.rdb del database. Una volta inviato il file, inizia a inviare comandi nel protocollo Redis, che è anche il formato AOF.

Ecco il quadro ad alto livello di ciò che si può fare:

  1. Connettersi al server Redis ed eseguire il comando SYNC
  2. Salva e analizzare il file dump.rdb. Costruisci il set di dati iniziale. A node.js based rdb parser è disponibile
  3. Analizzare i comandi che seguono. Dal momento che si trovano nel protocollo Redis, è possibile iniziare con una libreria Redis esistente.
  4. Per ogni comando si riceve, invocare una callback

Sembra un sacco di lavoro, ma si dovrebbe essere in grado di incidere questo abbastanza facilmente. E sarebbe anche una buona libreria open source!

EDIT: Sync v/s Monitor

  1. Monitor è un comando di debug. Il formato di risposta può (e ha) cambiare (d) nel tempo. Sync viene utilizzato per Master -> Replica slave, quindi verrà supportato meglio
  2. Monitor emetterà tutti i comandi, inclusi i comandi di sola lettura. Sync otterrà solo i comandi che modificano i dati.
  3. Monitor registrerà i singoli comandi eseguiti all'interno di uno script lua.Sync trasferirà solo l'intero script lua, quindi dovrai analizzare lo script da solo. Questo è davvero un interruttore per sync.
  4. Monitor registrerà i comandi non riusciti, Sync registrerà solo i comandi che modificano i dati. Ad esempio, il comando del non-existing-key verrà registrato dal monitor ma non verrà visualizzato quando si esegue la sincronizzazione.
+0

Grazie Sripathi! Potresti darmi una panoramica di alto livello di questo vs usando il monitor per gli aggiornamenti? – fancy

+1

@fancy vedi gli aggiornamenti alla mia risposta –

10

due opzioni:

  1. Utilizzare MONITOR comando - si ripercorre ogni comando che arriva a Redis ed è possibile analizzare e vedere quando la tua collezione viene toccato.

  2. Se "si possiede" il codice che scrive nella raccolta, segnalare l'altro codice (la richiamata). È possibile utilizzare il canale Redis Pub/Sub per questo.

EDIT Redis è in realtà sta per implementare questa funzionalità nella versione 2.8. Vedere il post del blog di Antirez su questo: Redis keyspace changes notification system.

+0

@fancy visualizzare gli aggiornamenti per la mia risposta –

3

risposta breve - no.

risposta leggermente più lunga - è possibile farlo solo se si aggiunge la pubblicazione su un canale specifico in redis PubSub nel client. o MONITOR utente per analizzare qualsiasi cosa diavolo sta succedendo in redis, ma se quel processo perde la connessione con redis - sei fregato.

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

Se si utilizza Java. redis-replicator implementa il protocollo di replica redis. Maggiori dettagli si rimanda al references

0

Nel 2017

C'è ora una pubblicazione/sottoscrizione meccanismo che è possibile utilizzare con il modulo node-redis. Vedere la documentazione specifica HERE. (Funziona anche con redis-mock per i test)

È possibile avere più abbonati (ascoltatori) sullo stesso canale, che nel tuo caso sarebbe la chiave della tua raccolta.

campione veloce: (vedi sopra la documentazione per i dettagli di implementazione)

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] 
Problemi correlati