Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

node.js with redis: synchronous or asynchronous?

Tags:

node.js

redis

In my app (node / express / redis), I use some code to update several items in DB at the same time:

app.put('myaction', function(req, res){
    // delete stuff
    db.del("key1");
    db.srem("set1", "test");

    // Add stuff
    db.sadd("set2", "test2");
    db.sadd("set3", "test3");
    db.hmset("hash1", "k11", "v11", "k21", "v21");
    db.hmset("hash2", "k12", "v12", "k22", "v22");
    // ...

    // Send response back
    res.writeHead(200, {'content-type': 'application/json'});
    res.write(JSON.stringify({ "status" : "ok" }));

    res.end(); 
});

Can I be sure ALL those actions will be performed before the method returns ? My concern is the asynchronous processing. As I do not use callback function in the db actions, will this be alright ?

like image 254
Luc Avatar asked Dec 10 '25 19:12

Luc


2 Answers

While all of the commands are sent and responses parsed asynchronously, it's useful to note that the callbacks are all invoked in order. So you can use the callback of the last Redis command to send the response to the client, and then you'll know that all of the Redis commands have been executed before responding.

like image 76
Matt Ranney Avatar answered Dec 13 '25 13:12

Matt Ranney


Use the MULTI/EXEC command to create a queue of your commands and execute them in a row. Then use a callback to send a coherent response back (success/failure). Note that you must use Redis' AOF to avoid that - in case of crash - the db state is not coherent with your logic because only a part of the commands in the queue were executed: i.e. MULTI/EXEC is not transactional upon execution. This is a useful reference.

like image 23
ziu Avatar answered Dec 13 '25 14:12

ziu



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!