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
秒,因为具有相同分数的同一个成员不能被添加两次。