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

时间:2012-10-06 17:21:00

标签: javascript node.js transactions redis node-redis

我遇到一个问题,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值)

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

1 个答案:

答案 0 :(得分:0)

你的redis版本是什么?

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

如果您使用的是redis 2.6.5或更高版本,那么使用未正确排队的命令执行EXEC命令将返回错误,因此不应该是您的情况,可能的解释是某些竞争条件或不存在的密钥如提示在上面的表述。来自hgetall的“null”回复意味着密钥不存在 - 所以在执行事务时它真的不存在吗?