2015-04-23 4 views
6

Ich habe zwei redis Kunden, in einer Datei, die ich ein einfaches Skript habe Einstellung und gelöscht Redis Tasten:Redis Schlüsselraum Ereignis nicht abstrahlende

var redis = require("redis"); 

var client = redis.createClient('6379','127.0.0.1'); 
client.config("SET","notify-keyspace-events", "KEA"); 

client.set("string key 1", "string val", redis.print); 
client.set("string key 2", "string val", redis.print); 
client.set("placeholder","placeholder value", redis.print); 
client.del("string key 1", redis.print); 
client.del("string key", redis.print); 

in der zweiten Datei, habe ich einen Redis-Client als Teilnehmer bedient :

var redis = require("redis"); 
var subscriber = redis.createClient('6379','127.0.0.1'); 

const REDIS_PUB_MESSAGE = 'redis_pub_message'; 
const EVENT_SET = '[email protected]__:set'; 
const EVENT_DEL = '[email protected]__:del'; 
const SPACE_SPECIFIC_KEY = '[email protected]__:placeholder set'; 
const EVENT_SPECIFIC_KEY = '[email protected]__:placeholder set'; 
const SPACE_SPECIFIC_KEY_set = '[email protected]__:set placeholder'; 
const EVENT_SPECIFIC_KEY_set = '[email protected]__:set placeholder'; 

subscriber.on('message', function(channel, key) { 
    switch (channel) { 
     case SPACE_SPECIFIC_KEY_set: 
      console.log('space specific key channel:',channel,'key:',key); 
     case EVENT_SPECIFIC_KEY_set: 
      console.log('event specific key channel:',channel,'key:',key); 
     case EVENT_SPECIFIC_KEY: 
      console.log('space specific key channel:',channel,'key:',key); 
     case SPACE_SPECIFIC_KEY: 
      console.log('event specific key channel:',channel,'key:',key); 
    } 
}); 

der Schlüssel ‚Platzhalter‘ gesetzt wird, so gibt es einen guten Grund, dass ich keine Ausgabe in der ‚Botschaft‘ Handler bin immer?

Antwort

13

Sie haben vergessen, den Abonnenten-Client für einen bestimmten Kanal zu abonnieren. Wenn Sie alle Ereignisse überwachen möchten, müssen Sie ein musterbasiertes Abonnement verwenden.

Vielleicht möchten Sie so etwas wie dieses (nicht getestet) tun:

subscriber.on("pmessage", function (pattern, channel, message) { 
    console.log("("+ pattern +")" + " client received message on " + channel + ": " + message); 
    switch (channel) { 
     // blah blah blah 
     // ... 
    } 
}); 
subscriber.psubscribe(''__key*__:*') 

weitere Informationen in der Redis documentation See, und in node_redis examples.

Update:

Hier ist ein Beispiel der Unterschied zwischen Kanal subcription und Muster Abonnement zu illustrieren. Eine korrekte Fehlerbehandlung ist der Kürze halber weggelassen.

var redis = require("redis"); 

var client = redis.createClient('6379','127.0.0.1'); 
var subscriber1 = redis.createClient('6379','127.0.0.1'); 
var subscriber2 = redis.createClient('6379','127.0.0.1'); 

// First subscriber listens only to events occurring for key mykey 
function S1(next) { 
    subscriber1.on('message', function(channel, msg) { 
     console.log("S1: received on "+channel+" event "+msg) 
    }); 
    subscriber1.subscribe("[email protected]__:mykey", function (err) { 
     next(); 
    }); 
} 

// Second subscriber listens to events occuring for ALL keys 
function S2(next) { 
    subscriber2.on('pmessage', function(pattern,channel, msg) { 
     console.log("S2: received on "+channel+" event "+msg) 
    }); 
    subscriber2.psubscribe("[email protected]__:*", function (err) { 
     next(); 
    }); 
} 

// Do something with keys mykey and anotherkey 
function do_something() { 
    client.set("mykey","example", function(err) { 
     client.set("mykey", "another example", function(err) { 
      client.del("mykey", function(err) { 
       client.set("anotherkey","example", function(err) { 
        client.del("anotherkey"); 
       }); 
      }); 
     }); 
    }); 
} 

// Here we go 
S1(function() { 
    S2(function() { 
     do_something(); 
    }); 
}); 

Das Ergebnis dieses Skripts ist:

S1: received on [email protected]__:mykey event set 
S2: received on [email protected]__:mykey event set 
S2: received on [email protected]__:mykey event set 
S1: received on [email protected]__:mykey event set 
S1: received on [email protected]__:mykey event del 
S2: received on [email protected]__:mykey event del 
S2: received on [email protected]__:anotherkey event set 
S2: received on [email protected]__:anotherkey event del 

Sie, dass der erste Teilnehmer für mykey nur Ereignisse empfangen sehen können, während der zweite Teilnehmer Ereignisse für alle Schlüssel erhält.

+0

Sie haben Recht, das ist das Problem. aber eine Frage zu deiner Antwort - "wenn du auf alle Ereignisse aufpassen willst", versuche ich nicht ungläubig zu sein, aber warum pmessage statt message? Ich sehe derzeit den Zweck von pmessage nicht. –

+0

Nun, wenn Sie nur ein einfaches kanalbasiertes Abonnement verwenden, erhalten Sie nur einen einzigen Nachrichtentyp, da der Kanalname dem Nachrichtentyp entspricht. Wenn Sie beispielsweise \ _ \ _ keyevent @ 0 \ _ \ _: del abonnieren, erhalten Sie nur del-Ereignisse für alle Schlüssel. Wenn Sie auch die anderen Ereignisse benötigen, müssen Sie mehrere Kanäle abonnieren oder ein musterbasiertes Abonnement verwenden. –

+0

Didier, Entschuldigung, ich habe dich nicht ganz verstanden. Und als Antwort scheint es, dass ich in der Lage bin, einen bestimmten Schlüssel zu abonnieren, wie mit der Zeile "const EVENT_SPECIFIC_KEY_del = '__keyevent @ 0 __: del placeholder';" das hört auf den Schlüssel namens "Platzhalter" ... Ich verstehe immer noch nicht den Zweck von Nachricht gegen Nachricht. Wenn ich diese Dichotomie vielleicht verstehen würde, würde ich verstehen, was Sie meinen. –

Verwandte Themen