javascript - Redis MULTI 事务在 NodeJS 中的 EXEC 回调中随机返回 null

标签 javascript node.js transactions redis node-redis

我遇到一个问题,EXEC 的回调随机返回一些值作为 null

大部分时间代码运行良好,但随机失败(或者如果我反复刷新浏览器)...

这里是简化到失败点的代码:

var transaction = client.multi();
reply.forEach(function (id) { // reply always equals [ 'mykey1', 'mykey2' ]
  transaction.hgetall(namespace + ":" + id);
});
transaction.exec(function (err, replies) {
  // 'replies' sometimes returns all the responses properly,
  // other times it returns some of the values as null
  // See the examples I wrote below
});

当它工作正常时,exec 回调返回这个:

[{
  owner: '123',
  id: 'asdasdasd',
  name: 'asdasdasd',
  created_at: '2012-10-06T09:26:25.596Z',
  updated_at: '2012-10-06T09:28:54.929Z'
},
{
  owner: '456',
  id: 'asdfsdfasdf',
  name: 'asdfsdfasdf',
  created_at: '2012-10-06T09:27:19.251Z',
  updated_at: '2012-10-06T09:28:03.116Z'
}]

当它不起作用时,它返回这个:(注意 null 值)

[{
  owner: '123',
  id: 'asdasdasd',
  name: 'asdasdasd',
  created_at: '2012-10-06T09:26:25.596Z',
  updated_at: '2012-10-06T09:28:54.929Z'
}, null]

最佳答案

你的redis版本是多少?

2.6.5 之前的版本执行事务,即使某些命令无法排队 - 您需要检查事务 block 内的每个命令是否确实失败(使用回调的错误参数)。

如果您使用的是 redis 2.6.5 或更新版本,事务的 EXEC 命令和未正确排队的命令将返回错误,所以这不应该是您的情况,并且可能的解释是某些竞争条件或暗示的不存在的键在上面表扬。来自 hgetall 的“null”回复意味着该 key 不存在 - 所以它可能在执行事务时真的不存在?

关于javascript - Redis MULTI 事务在 NodeJS 中的 EXEC 回调中随机返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762016/

相关文章:

nhibernate - 使用 CaSTLe.Facilities.AutoTx 运行 NHibernate 时出现 MissingTransactionException

google-app-engine - GAE、Cloud SQL 和 run_in_transaction

PHP 事务不回滚

javascript - 寻求有关采取什么方法进行多个图像交换的建议

javascript - socket.io 对于广播应用程序无法正常工作

javascript - 如何调整 HTML 元素的高度以覆盖其父元素的所有可用空间?

node.js - 如何在 Mongoose 中自动生成自定义 id?

javascript - Firebase 云功能 - 更新 Node

javascript - 为什么不能在 JavaScript "Class"中调用自身?

javascript - 为什么要使用 void 关键字?