在redis中执行sequent命令

时间:2014-07-15 07:32:00

标签: node.js redis

此代码不起作用,我找不到原因? 它总是推动obj右序列化的JSON字符串,但它总是返回错误的键。在obj id中经常增加,但关键不是。

var c = redis.createClient(),
        obj = {id:0, name:"dudu"},
        key="person:";

c.select(0);

c.multi()
    .incr("idx:person", function(err, _idx) {
        console.log("incr -> #idx: " + _idx);
        key += obj.id = _idx;
        console.log("After Inc obj: " + JSON.stringify(obj));
    })
    .set(key, JSON.stringify(obj), function(err, _setResp) {
        console.log("set -> #_setResp: " + _setResp);
        console.log(JSON.stringify(ihale));
    })
    .get(key, function(er, _obj) {
        console.log("get -> " + key);
        if (er) {
            res.json(er);
        } else {
            console.log("Found: " + JSON.stringify(_obj));
            res.json(_obj);
        }
    })
    .exec(function(err, replies) {
        console.log("MULTI got " + replies.length + " replies");
        replies.forEach(function(reply, index) {
            console.log("Reply " + index + ": " + reply.toString());
        });
    });
c.quit();

enter image description here enter image description here enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

在事务模式命令中,命令被分组并传递给Redis。 Exec命令执行您传递的代码。将密钥值传递给set命令时,右侧没有增量键值。

对于这种用途,如果你仍然希望在一个中合并命令,请在Lua中编写脚本:

local keyid = redis.call('INCR', 'idx:person')
local result = redis.call('SET', 'person:'..keyid,ARGV[1])
return 'person:'..keyid

在redis eval命令中使用它:

eval "local keyid = redis.call('INCR', 'idx:person'); local result = redis.call('SET', 'person:'..keyid,ARGV[1]);return 'person:'..keyid" 0 "yourJSONObject"

这应该有效:

client.eval([ "local keyid = redis.call('INCR', 'idx:person'); local result = redis.call('SET', 'person:'..keyid,ARGV[1]);return result", 0,JSON.stringify(obj)  ], function (err, res) {
 console.log(res); // give the personID
});

您还可以在示例中使用哈希而不是简单的键来表示单独的id,name和json对象。从lua脚本返回哈希就像从hset返回它一样。

答案 1 :(得分:0)

这有效:

c.INCR("idx:person", function(a,b) {
    obj.id = b;
    console.dir(obj);
    key = "pa:" + b;
    c.set(key, JSON.stringify(obj), function(err, _setResp) {
        console.log("set -> #_setResp: " + _setResp);
        console.log(JSON.stringify(obj));
        c.get(key, function(er, _obj) {
            console.log("get -> " + key);
            if (er) {
                res.json(er);
            } else {
                console.log("Found: " + JSON.stringify(_obj));
                res.json(_obj);
            }
        });
    });
});

enter image description here enter image description here

这样做的方法很简单:) 事件驱动的节点正在执行前一个节点内的每个部分:

c.INCR("idx:person", function(a,b) {
    obj.id = b;
    key = "pa:" + b;
    c.set(key, JSON.stringify(obj), function(err, _setResp) {
        c.get(key, function(er, _obj) {
            if (er) {
                res.json(er);
            } else {
                res.json(_obj);
            }
        });
    });
});