복붙노트

[REDIS] 레디 스의 키 스페이스 행사하지 발사

REDIS

레디 스의 키 스페이스 행사하지 발사

나는 하나 개의 파일에 나는 간단한 스크립트 설정을 가지고 레디 스 키를 삭제, 두 레디 스 클라이언트를 가지고 :

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

두 번째 파일에, 나는 가입자 역할을하는 레디 스 클라이언트가 :

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

const REDIS_PUB_MESSAGE = 'redis_pub_message';
const EVENT_SET = '__keyevent@0__:set';
const EVENT_DEL = '__keyevent@0__:del';
const SPACE_SPECIFIC_KEY = '__keyspace@0__:placeholder set';
const EVENT_SPECIFIC_KEY = '__keyevent@0__:placeholder set';
const SPACE_SPECIFIC_KEY_set = '__keyspace@0__:set placeholder';
const EVENT_SPECIFIC_KEY_set = '__keyevent@0__: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);
    }
});

키 '자리'그래서 나는 '메시지'핸들러에서 모든 출력을받지 오전 어떤 좋은 이유가, 설정되는?

해결법

  1. ==============================

    1.당신은 특정 채널에 가입자 클라이언트를 구독하는 것을 잊었다. 모든 이벤트를보고 싶은 경우 또한, 당신은 패턴 기반 구독을 사용해야합니다.

    당신은 특정 채널에 가입자 클라이언트를 구독하는 것을 잊었다. 모든 이벤트를보고 싶은 경우 또한, 당신은 패턴 기반 구독을 사용해야합니다.

    당신이 뭔가를 (안된) 수행 할 수 있습니다 :

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

    레디 스 문서에서 더 많은 정보를 참조하고, node_redis 예이다.

    최신 정보:

    여기서 채널 정액제 가입 패턴의 차이를 설명하기위한 일례이다. 적절한 오류 처리는 간결함을 위해 생략한다.

    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( "__keyspace@0__: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( "__keyspace@0__:*", 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();
        });
    });
    

    이 스크립트의 결과는 다음과 같습니다

    S1: received on __keyspace@0__:mykey event set
    S2: received on __keyspace@0__:mykey event set
    S2: received on __keyspace@0__:mykey event set
    S1: received on __keyspace@0__:mykey event set
    S1: received on __keyspace@0__:mykey event del
    S2: received on __keyspace@0__:mykey event del
    S2: received on __keyspace@0__:anotherkey event set
    S2: received on __keyspace@0__:anotherkey event del
    

    당신은 두 번째 가입자가 모든 키에 대한 이벤트를 수신하는 동안 처음으로 가입자가,의 mykey 만 이벤트를받은 것을 볼 수 있습니다.

  2. from https://stackoverflow.com/questions/29833939/redis-keyspace-event-not-firing by cc-by-sa and MIT license