NodeJS Redis 监听器

3

在Node.js中,是否可能监听来自Redis的更改值事件?

情境: 我有一个NodeJS应用程序,它显示来自另一个应用程序(在同一台服务器上的本机应用程序,称其为"foo",并将节点应用程序称为"bar")的实时数据。

"Foo"将机器状态保存在Redis键"state"中。"Bar"注册并显示它。如何捕获此事件?

编辑: Pierre的解决方案可以很好地获取键,但是如何检索值呢?我尝试了这种方式,但是出现了解析错误:

var redis = require("redis");
var client_redis = redis.createClient();

client_redis.config('set', 'notify-keyspace-events', 'KEA');
client_redis.subscribe('__keyevent@0__:set');
client_redis.on('message', function(channel, key) {
  client_redis.get(key, function(error, result) {
    if (error) console.log(error);
    else console.log(result);
  });
});

错误

$ { ReplyError> at parseError (/home/pi/Website/node_modules/redis-parser/lib/parser.js:181:12) -bash: syntax error near unexpected token `('

编辑 #2

似乎client_redis.subscribe('...')阻止客户端读取相应键的值。我添加了第二个客户端来读取该值。

工作示例:

var redis = require("redis");
// Client for subscription
var subscriptionClient = redis.createClient();
// Client for reading the values from the keys. 
var readClient = redis.createClient();


subscriptionClient.config('set', 'notify-keyspace-events', 'KEA');
// subscribe to the key event so we get notificated if a value changes
subscriptionClient.subscribe('__keyevent@0__:set');

subscriptionClient.on('message', function(channel, key) {
  readClient.get(key, function(err, value) {
     console.log(value);
  });
});

是的,您需要添加第二个Redis客户端。一旦Redis客户端进入订阅模式,它就不能执行除订阅更多频道或取消订阅已订阅频道之外的任何操作。 - Pierre Maoui
2个回答

12

是的,这是可能的。你需要使用Redis Keyspace Notifications

尤其是看一下由不同命令生成的事件部分。你可能想在使用SET命令时收到通知:

var redis = require('redis');
var client_redis = redis.createClient();

// enable notify-keyspace-events for all kind of events (can be refined)
client_redis.config('set','notify-keyspace-events','KEA');

client_redis.subscribe('__keyevent@0__:set');
// you can target a specific key with a second parameter
// example, client_redis.subscribe('__keyevent@0__:set', 'mykey')

client_redis.on('message', function(channel, key) {
  // do what you want when a value is updated
});

我在我的问题中添加了一个Edit-Part。到目前为止,非常感谢您,发现关键字的工作非常好,但是您知道如何摆脱那个解析错误,以便我可以检索我的值吗? - FRules
我该如何获取已过期的键的值? - Rodrigo Alcorta

0
const redis = require('redis');

(async () => {

  const client = redis.createClient();

  const subscriber = client.duplicate();

  await subscriber.connect();
  await subscriber.pSubscribe('__keyevent@0__:expired', (key, event) => {
  console.log('key::' + key); // 'message'
  console.log('event::' + event.replace('__keyevent@0__:', ''));
});

})();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接