How can I pop objects from Redis as they are added

2019-04-29 16:12发布

问题:

I want to get a Node.js process running as it's checking a Redis server for anything new to pop.

Another process will be doing the pushing sporadically, and the Node process will be trying to pop whatever that comes in. The Node process will stay running.

Can anyone point me to a good direction?

I'm trying to figure out how to listen for such event. Sure, I can pop it once, but how do I get Node process to keep listening for any addition to Redis server?

回答1:

You'll want to use a blocking pop: http://redis.io/commands/brpop

function waitForPush () {
  client.brpop(['list','otherlist',0], function (listName, item) {
    // do stuff
    waitForPush();
  });
}


回答2:

This seems like a good use case for pub/sub: http://redis.io/topics/pubsub

Your Node.js process that sporadically pushes to Redis can also publish to a channel each time it pushes something. Like this:

var pushClient = redis.createClient();
//push something onto Redis
pushClient.publish("pubsub-channel", "Just pushed something onto Redis");

Then your other process would subscribe to that channel. Each time the message event is fired, you pop off whatever was just pushed:

var client = redis.createClient();
client.subscribe("pubsub-channel");
client.on("message", function(channel, message){
//pop off new item
});


回答3:

How about a modified version of recursive function with a process.nextTick(...)

function waitForPush () {
  client.brpop(['list','otherlist',0], function (listName, item) {
    // do stuff
    process.nextTick(waitForPush);
  });
}


标签: node.js redis