当前位置: 首页 > 面试题库 >

Redis键空间事件未触发

洪宏硕
2023-03-14
问题内容

我有两个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);

在第二个文件中,我有一个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:',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);
    }
});

关键的“占位符”已设置,那么是否有充分的理由使我在“消息”处理程序中未获得任何输出?


问题答案:

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

您可能想要执行以下操作(未测试):

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示例中的更多信息。

更新:

这是一个示例,说明了频道订阅和模式订阅之间的区别。为了简洁起见,省略了正确的错误处理。

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事件,而第二个订阅者接收了所有关键字事件。



 类似资料:
  • 问题内容: 我有3个文件: js_json.js->用于我的json代码 javascript.js->用于我的javascript函数 index.php 这里的代码为: 这是我的代码: 这里的代码: 我的问题是: 当我单击链接“ Hola Test 1”时,它将起作用并显示消息。问题是,在单击选择选项之后,出现了链接“ Hola Test”,然后单击该链接(“ Hola Test”),该消息没

  • 问题内容: 我有一个带有一列复选框的GridView(GridView的其余部分正在从数据库中填充)。我正在使用AJAX执行不同的功能,并且想知道我是否只是在正确的位置调用了OnCheckedChanged事件。是否应该将其包装在某种UpdatePanel中?我对这一切的工作方式仍然很陌生…基本上,我的目标是在选中复选框后更改数据库中的位值。我知道该怎么做的逻辑,我只是​​不知道我是否以正确的方式

  • 我正在为android创建一个phonegap应用程序,并想使用一些phonegap事件,如“恢复”、“暂停”、“后退按钮”等,但除了“deviceready”事件外,这些事件都不会被触发。以下是我的javascript代码,请检查我是否犯了任何错误: “ondeviceredy()”函数中的警报正在工作。 请帮忙,提前谢谢。

  • 我遇到了一个奇怪的JavaScript问题。我正在开发一个使用键盘输入的HTML5画布游戏。游戏的双人模式需要按住键盘上最多6个键。 在我按住键盘上的4或5个键后,似乎停止调用“keyDown”事件。 我使用的代码如下: 控制台应该为我按下的每个键记录一个键代码。然而,它似乎只报告我按住的前4或5个键的密码。这导致了当两个玩家按下太多键时,我的游戏的双玩家版本的控件无法工作。 这是一个bug,是J

  • 我已经在Flink中实现了CEP模式,它按预期工作连接到本地Kafka代理。但是当我连接到基于集群的云kafka设置时,Flink CEP不会触发。 我正在使用AscendingTimestampExtractor, 我也收到警告消息, AscendingTimestampExtractor:140-违反时间戳单调性:1594017872227 而且我也尝试过使用Assignerwith周期水印和

  • 我在Flink SQL中使用了CEP模式,它按照预期连接到Kafka broker。但是当我连接到基于集群的云kafka设置时,Flink CEP没有触发。以下是我的sql: 然后我以json格式发送消息,如 在 flink Web ui 中,水印工作精细 flink Web ui 我运行我的cep sql: 每个Kafka消息,connect_ 这是另一个仍然不起作用的cep sql。并且age