【问题标题】:Redis MULTI transaction randomly returning null on EXEC callback in NodeJSRedis MULTI 事务在 NodeJS 中的 EXEC 回调中随机返回 null
【发布时间】:2012-09-27 12:58:09
【问题描述】:

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

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

这里的代码被简化到失败的地步:

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]

【问题讨论】:

  • 听起来你在某处有竞争条件。您是在其他地方删除密钥还是设置过期时间?
  • 关于失败,在调用 exec 之前,console.log(transaction) 的输出是什么样的?它应该向您显示电话。

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


【解决方案1】:

你的redis版本是多少?

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

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

【讨论】:

    猜你喜欢
    • 2022-12-29
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多