Node.js& redis / zadd对象到集合

时间:2015-06-09 07:18:04

标签: node.js redis

我有以下代码:

var db = require("redis");
var dbclient1 = db.createClient();

dbclient1.zadd("myprivateset", 3, {"guid":"abab-baba", "data-persistent":"xxxx", "size":"20"})
dbclient1.zadd("myprivateset", 2, {"guid":"abab-baba3", "data-persistent":"xxxx", "size":"20"})
dbclient1.zrangebyscore("myprivateset", 1, 4)
dbclient1.hgetall("myprivateset", function(err, rep){
 console.log(rep);
});

我希望将我的对象(采用JSON格式)存储在一个有序集合中,该集合由分数决定(在我们的例子中为3& 2)。

出于某种原因,当我打印此表(rep)时,我得到了未定义。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

问题1 - 排序集键

尝试将您正在使用的JSON字符串化为已排序集的键。例如,

dbclient1.zadd("myprivateset", 3, {"guid":"abab-baba", "data-persistent":"xxxx", "size":"20"}) 

需要:

dbclient1.zadd("myprivateset", 3, JSON.stringify({"guid":"abab-baba", "data-persistent":"xxxx", "size":"20"})) 

如果不对字符串进行字符串化,则每个zadd每次都会使用键[object Object]覆盖。也就是说,您的排序集中只有一个项目无法识别([object Object]除外)。

问题2 - 获取数据

此外,hgetall不是用于在redis排序集中检索数据的redis命令。您将要关注有序排序的特定命令。此处列出了redis命令列表:http://redis.io/commands

答案 1 :(得分:1)

我的两分钱,基于@ leonid-beschastny和@ cpentra1的评论。我建议使用redis.multi()。它允许批量调用多个调用,正如您在示例中所看到的,只要将三个元素添加到有序集中,我们就可以在同一zrangebyscore批处理中执行multi得到预期的结果。可以动态创建指令。调用replies时的multi.exec()数组会按顺序返回每个multi操作的结果。

var db = require("redis");
var dbclient1 = db.createClient();
var multi = dbclient1.multi();

// We use JSON.stringify() as suggested by @cpentra1 
multi.zadd("myprivateset", 3, JSON.stringify({"guid":"abab-baba", "data-persistent":"xxxx", "size":"20"}));
multi.zadd("myprivateset", 2, JSON.stringify({"guid":"abab-baba3", "data-persistent":"xxxx", "size":"20"}));
multi.zadd("myprivateset", 2, JSON.stringify({"guid":"abab-dafa3", "data-persistent":"yyyy", "size":"21"}));
multi.zrangebyscore("myprivateset", 1, 4);
multi.zcard("myprivateset"); // The total number of elements in the set
multi.exec(function(err, replies) {
    console.log(replies)
    // Will output something like:
    // [ 1,
    //   1,
    //   1,
    //   [ '{"guid":"abab-baba3","data-persistent":"xxxx","size":"20"}',
    //     '{"guid":"abab-dafa3","data-persistent":"yyyy","size":"21"}',
    //     '{"guid":"abab-baba","data-persistent":"xxxx","size":"20"}' ],
    //   3 ]
});

注意:如果您运行相同的示例两次,而不是1数组的前三个元素中的replies s,那么您将0作为同一成员相同的分数不能加两次。