2015-04-23 18 views
6

Mam dwa Redis klientów, w jednym pliku mam prosty skrypt ustawienie i usunięte Redis klawiszy:Redis wydarzenie KEYSPACE nie wypalania

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); 

w drugim pliku, mam klienta Redis służąc jako abonenta :

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); 
    } 
}); 

klucz „zastępczy” jest ustawiona, więc jest jakiś powód, że nie otrzymuję żadnego wyjścia w „wiadomości” przewodnika?

Odpowiedz

13

Zapomniałeś zasubskrybować klienta subskrybenta do określonego kanału. Ponadto, jeśli chcesz oglądać wszystkie wydarzenia, musisz użyć subskrypcji opartej na wzorcach.

Możesz zrobić coś takiego (niesprawdzone):

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

Zobacz więcej informacji w Redis documentation, aw node_redis examples.

Update:

Oto przykład ilustrujący różnicę pomiędzy subcription kanału i subskrypcji wzorca. Właściwa obsługa błędów jest pominięta dla zwięzłości.

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(); 
    }); 
}); 

Wynikiem tego skryptu jest:

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 

Widać, że pierwszy abonent otrzymał tylko zdarzenia dla MyKey, natomiast drugi abonent otrzymuje zdarzenia dla wszystkich kluczy.

+0

masz rację, to jest problem. ale jedno pytanie o twoją odpowiedź - "jeśli chcesz oglądać na wszystkie wydarzenia", nie próbuję być niewiarygodny, ale dlaczego zamiast wiadomości zamiast wiadomości? Obecnie nie widzę celu pmessage. –

+0

Cóż, jeśli używasz tylko subskrypcji opartej na kanale, otrzymasz tylko jeden typ wiadomości, ponieważ nazwa kanału odpowiada typowi wiadomości. Na przykład, jeśli zasubskrybujesz \ _ \ _ keyevent @ 0 \ _ \ _: del, otrzymasz tylko del zdarzenia dla wszystkich kluczy. Jeśli potrzebujesz także innych wydarzeń, musisz zasubskrybować kilka kanałów lub użyć subskrypcji opartej na wzorcach. –

+0

Didier, przepraszam, niezupełnie cię rozumiem. W odpowiedzi wygląda na to, że mogę zasubskrybować określony klucz, tak jak w przypadku wiersza "const EVENT_SPECIFIC_KEY_del = '__keyevent @ 0 __: del placeholder';" to nasłuchuje klucza zwanego "placeholder" ... Nadal nie rozumiem celu pmessage vs. message. Być może, gdybym zrozumiał tę dychotomię, zrozumiałbym, co masz na myśli. –

Powiązane problemy