我有以下代码:
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
)时,我得到了未定义。
我做错了什么?
答案 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
作为同一成员相同的分数不能加两次。