node.js – Redis键空间事件未触发

我有两个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",redis.print);
client.set("placeholder","placeholder value",redis.print);
client.del("string key 1",redis.print);
client.del("string key",redis.print);

在第二个文件中,我有一个Redis客户端作为订阅者:

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:',key);
        case EVENT_SPECIFIC_KEY:
            console.log('space specific key channel:',key);
        case SPACE_SPECIFIC_KEY:
            console.log('event specific key channel:',key);
    }
});

关键的’占位符’正在设置,所以有没有什么好的理由我没有在’message’处理程序中获得任何输出

解决方法

您忘记将订阅者客户端订阅到特定频道.此外,如果要监视所有事件,则需要使用基于模式的订阅.

您可能想要做这样的事情(未经测试):

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

请参阅Redis documentationnode_redis examples中的更多信息.

更新:

这是一个例子来说明频道订阅和模式订阅间的区别.为简洁起见,省略了适当的错误处理.

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',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,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",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的事件,而第二个订阅者收到所有键的事件.

相关文章

这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关...