Redis键空间事件不触发

2024-04-19

我有两个 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 文档 http://redis.io/topics/notifications,并在node_redis 示例 https://github.com/mranney/node_redis/tree/master/examples.

Update:

下面通过一个例子来说明通道订阅和模式订阅的区别。为了简洁起见,省略了适当的错误处理。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis键空间事件不触发 的相关文章

  • Node.js 支持的操作系统

    是否有关于 Node js 支持的确切操作系统的官方声明 我唯一能找到的是this one https docs appdynamics com display PRO42 Node js Supported Environments No
  • 快速会话未保存到 iPad

    我试图在用户登录时保存会话变量 这在计算机上有效 但是当我在电脑上尝试时iPad using Safari or Chrome它不会保存 这是我设置会话的地方 app set trust proxy 1 app use session se
  • 文件更改时重新启动 Heroku 本地吗?

    看来以 heroku local web 启动的本地服务器不会监视文件更改并自行重新启动 我怎样才能让它做到这一点 最简单的方法是运行 nodemonheroku local作为可执行文件 即nodemon exec heroku loca
  • 如何在 $match 内的 mongodb 聚合查询中使用 $regex

    我正在尝试使用 regex http docs mongodb org manual reference operator regex within match http docs mongodb org manual reference
  • Knexjs 返回 mysql 时间戳、日期时间列作为 Javascript Date 对象

    我正在使用 knex 并以格式插入数据YYYY MM DD HH mm ss e g 2017 07 14 15 00 00 保存后 当提取数据时 日期时间列值将作为 JavaScript Date 对象返回 我想以以下格式返回这些对象YY
  • Windows Azure 网站上运行的是哪个版本的 node.js?

    Windows Azure 网站上实际运行的是哪个版本的 node js Windows Azure 网站服务器上预安装了许多版本的节点 您可以通过在 package json 文件中指定所需的最低版本来选择使用哪一个版本 指示here h
  • 当我传递多个范围时,Microsoft Graph 权限范围引发错误

    我需要以编程方式将文件上传到 OneDrive 我不会有前端来生成密钥 因为我需要在没有用户交互的情况下生成它们 这就是我的问题 我已经成功地通过一个简单的 POC 做到了这一点 但它必然需要用户交互 因为它使用登录名和密码凭据对 Micr
  • 比较 PHP 和 NodeJS 之间的 BCrypt 哈希值

    对于我正在开发的应用程序 nodejs 需要验证 PHP 创建的哈希值 反之亦然 问题是 PHP 中生成的哈希值 通过 Laravel 的Hash类 它只使用 PHP 的password hash函数 在 Node js 中测试时返回 fa
  • 在 Firebase 管理中验证无密码电子邮件注册

    我试图让我的应用程序的用户通过电子邮件 链接登录 无需密码 客户端 用 React Native 编写 使用 Javascript SDK 请求登录链接 如下所示 基于这个答案 https stackoverflow com questio
  • grunt jasmine-node 测试运行两次

    我设置 grunt 来运行 node js 茉莉花测试 由于某种原因 使用此配置 结果总是显示双倍的测试 这是我的配置 我在用着茉莉花节点 https github com jasmine contrib grunt jasmine nod
  • 无法使用 Node npm 安装任何包

    我正在尝试通过 npm 安装一些节点包 但它不会安装 我已经尝试安装 卸载 更新节点 但似乎没有任何效果 我正在使用 ubuntu 12 04 以下是我尝试安装软件包的方式 npm install underscore npm http G
  • 调试 SSR node.js 服务器端 VSCode

    我在尝试调试 SSR React 应用程序 服务器端 时花费了太多时间 我们正在从头开始构建一个应用程序 这是一个非常大的项目 因此调试代码非常重要 服务器的 webpack 配置如下 const path require path con
  • { [FacebookTokenError:此授权码已被使用。]

    我有一个航行应用程序 我正在尝试实现 Facebook 登录 当我单击 使用 facebook 登录 按钮时 出现此错误 error A server error occurred in a request error FacebookTo
  • 当第一个套接字连接时加载两个图像而不是一个 - Node.js

    我正在尝试在我的游戏中实现多人游戏功能 我在用着node js为了这 当一个人连接时 应该将一张图像加载到浏览器中 相反 它加载两个图像 这是我班级的一部分 var count 0 Keep track of which player we
  • 如何在 Playwright 中使用已安装的 chrome 版本?

    我想使用铬而不是铬 我可以通过提供可执行路径在 puppeteer 中实现相同的目的 在 playwright 中它不起作用 因为浏览器类型参数仅支持 chromium webkit firefox const chromium requi
  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • 如何在 Nodejs 中创建代理下载

    我想创建一个nodejs服务器 它充当下载文件的代理 即用户点击 在下载按钮上 从nodejs服务器调用get nodejs服务器从不同的服务器获取链接 远程服务器并开始下载 以 TB 为单位 然后将该下载转发给用户 TB 文件不应存储在
  • 在 GCP PubSub 中收到任何响应之前重试总超时时间已超过

    我正在尝试使用 Node js 推送到 PubSub 主题 google cloud pubsub模块 这是 JavaScript 代码 const pubsub require google cloud pubsub class MyPu
  • Express.js req.ip 正在返回 ::ffff:127.0.0.1

    我目前正在尝试获取所请求用户的IP 问题是IP正在返回 ffff 127 0 0 1代替127 0 0 1 我尝试使用trusted proxy选项 尽管不使用代理 和req ips是空白的 使用 4 x Express js router
  • 使用node和multer将图像上传到heroku不起作用

    我正在尝试使用 Node 后端将图像文件上传到 Heroku 我可以使其工作 同样的过程在本地主机测试中工作得很好 但是在将我的项目部署到 Heroku 并测试它之后 过程和文件中出现错误不会上传 后端 let storage multer

随机推荐