如何以阻塞方式访问redis而不是nodejs中的非阻塞(事件回调)

时间:2013-06-11 00:39:31

标签: node.js redis sequence

我想在nodejs的书Patterns of Enterprise Application Architecture中实现Martin Flower的序列生成器组件,并将redis作为后端。

例如。

var redisClient = ...;
var count = redisClient.get('count');
var stepSize = 1000;
var initCount = 0;
count = count ? count : initCount;
var counterMax = count + stepSize;
redisClient.set('count', counterMax);
var counter = function(){
    ++count;
    if(count>=counterMax){
        counterMax = count + stepSize;
        redisClient.set('count', counterMax);
    }
    return count;
}
module.exports = {
    nextValue: counter
}

在我的客户端,我将使用:

var seq = require(./sequence);

app.get('/', function(req, res){
    var token = seq();
    if( req.cookies.userToken ){
        res,cookie( 'userToken', token );
    }

    ....

});

我需要以阻塞方式而不是异步方式访问nodejs中的redis,还有办法吗?以及如何?

1 个答案:

答案 0 :(得分:0)

  

我需要以阻塞方式访问nodejs中的redis而不是   异步方式

我不知道是否有一个带有同步API的redis库,但请记住,它可能会为您的整个应用程序带来潜在的瓶颈,因为您将阻止它直到您的同步操作完成,这与节点上的习语有关的.js。

  

有办法吗?怎么样?

您可以尝试通过transaction执行“无逻辑”命令集,或者从redis版本2.6开始,可以直接在redis端execute lua scripts执行此操作,这可能是一种方法。您不仅可以从node.js应用程序中卸载一些操作,还可以保存多个往返,但脚本将以redis原子方式执行,您无需处理应用程序中多个回调的管理。