Redis 键空间事件未触发 [英] Redis keyspace event not-firing

查看:71
本文介绍了Redis 键空间事件未触发的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个 redis 客户端,在一个文件中我有一个简单的脚本设置并删除了 Redis 键:

I have two redis clients, in one file I have a simple script setting and deleted Redis keys:

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

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

in the second file, I have a Redis client serving as a subscriber:

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

正在设置关键的占位符",那么我没有在消息"处理程序中获得任何输出有什么好的理由吗?

the key 'placeholder' is being set, so is there any good reason that I am not getting any output in the 'message' handler?

推荐答案

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

You forgot to subscribe the subscriber client to a specific channel. Furthermore, if you want to watch for all events, you need to use pattern-based subscription.

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

You may want to do something like this (untested):

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

Redis 文档node_redis 示例.

更新:

这里举例说明频道订阅和模式订阅的区别.为简洁起见,省略了正确的错误处理.

Here is an example to illustrate the difference between channel subcription and pattern subscription. Proper error handling is omitted for brevity sake.

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

You can see that first subscriber received only events for mykey, while second subscriber receives events for all keys.

这篇关于Redis 键空间事件未触发的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆