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

我有以下代码:

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 )时,我得到了未定义。

我做错了什么?

问题1 – sorting的设置键

尝试将您使用的JSONstring化为已sorting集的键。 例如,

 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"})) 

没有string键,每个zadd将使用每次覆盖键[object Object] 。 也就是说,你将只在你的sorting集合中有一个不可识别的项目(除了[object Object] )。

问题2 – 获取数据

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

我的两分钱build立在@ leonid-beschastny和@ cpentra1的评论上。 我推荐使用redis.multi() 。 它可以批量调用多个调用,正如您在示例中所看到的,只要将三个元素添加到有序集合中,我们就可以在同一个multi批次中执行一个zrangebyscore并获得预期的结果。 指令可以dynamic创build。 调用multi.exec()时的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 ] }); 

注意:如果两次运行相同的示例,而不是replies数组的前三个元素中的1秒,您将得到0秒,因为具有相同分数的同一个成员不能被添加两次。