Javascript Redis MULTI-transaction在NodeJS中执行回调时随机返回null

Javascript Redis MULTI-transaction在NodeJS中执行回调时随机返回null,javascript,node.js,transactions,redis,node-redis,Javascript,Node.js,Transactions,Redis,Node Redis,我有一个问题,EXEC的回调随机返回一些值作为nulls 代码在大多数情况下工作正常,但随机失败(或者如果我反复刷新浏览器) 下面是代码缩减到失败的程度: var transaction = client.multi(); reply.forEach(function (id) { // reply always equals [ 'mykey1', 'mykey2' ] transaction.hgetall(namespace + ":" + id); }); transaction.e

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

代码在大多数情况下工作正常,但随机失败(或者如果我反复刷新浏览器)

下面是代码缩减到失败的程度:

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
值)


你的redis版本是什么

2.6.5之前的版本执行事务,即使某些命令未能排队-您需要检查事务块中的每个命令是否失败(使用回调的错误参数)


如果您使用的是redis 2.6.5或更高版本,对于未正确排队的命令,事务的EXEC命令将返回错误,因此这不应该是您的情况,可能的解释是一些竞争条件或不存在的密钥,如上文所示。hgetall的“null”回复意味着密钥不存在——因此,在执行事务时,它可能真的不存在?

听起来好像您在某个地方有竞争条件。您是在其他地方删除密钥还是设置过期?在失败时,调用exec之前,
console.log(transaction)
的输出是什么样子的?它应该给你看电话。
[{
  owner: '123',
  id: 'asdasdasd',
  name: 'asdasdasd',
  created_at: '2012-10-06T09:26:25.596Z',
  updated_at: '2012-10-06T09:28:54.929Z'
}, null]