实际上,我正在使用优秀的库 redis-node。 但是,我不知道如何使以下情况起作用:
我有一个由参数传递的数量字段,然后,在一个 for 循环中,我需要使用 LPOP 从第一个列表中提取项目,然后 RPUSH 到另一个列表中,数量必须相同,都在一个交易区 block 。
那么,如果数量参数和提取的项目不同,我不想丢弃交易,这可能吗?
我放了一段我现在的代码。
var redisNode = require('redis-node');
var client = redisNode.createClient();
var qty = req.params.qty;
// init transaction, lpop first and rpush finally
client.transaction(function () {
for (var i=0; i <= qty; i++) {
client.lpop(initStockListKey, function (err, item) {
if (err) throw err;
console.log('[assign] CREATE TRANSACTION list %s, pop %s', initStockListKey, item);
inProgressItems.push(item);
});
}
// pop qty validation, DISCARD
if (inProgressItems.length != qty) {
client.discard(function (err, status) {
console.log('[assign] DISCARD TRANSACTION err %s status %s', err, status);
})
}
});
运行此代码时出现以下错误:
ERR EXEC without MULTI
最佳答案
您没有以正确的方式使用 MULTI
。检查在库的 GitHub repository 中找到的以下 node_redis
文档示例:
var redis = require("redis"),
client = redis.createClient(), multi;
// start a separate multi command queue
multi = client.multi();
multi.incr("incr thing", redis.print);
multi.incr("incr other thing", redis.print);
// runs immediately
client.mset("incr thing", 100, "incr other thing", 1, redis.print);
// drains multi queue and runs atomically
multi.exec(function (err, replies) {
console.log(replies); // 101, 2
});
// you can re-run the same transaction if you like
multi.exec(function (err, replies) {
console.log(replies); // 102, 3
client.quit();
});
在 Redis 中,EXEC
标记由 MULTI
启动的原子操作的结束。
关于node.js - Redis-node库丢弃事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32482537/