node-redis:executeIsolated如何影响被关注的键?

ruarlubt  于 5个月前  发布在  Redis
关注(0)|答案(1)|浏览(47)

我试图调试我的项目中的一些WatchErrors,我注意到我们没有使用isolatedClient,我想知道这是否是原因。我没有看到任何日志(或代码路径),表明被监视的键在被监视后被更改。
下面是我在一个transaction中实际写入Redis时的代码:

try {
  await this.client.watch(key);
  await this.client
    .multi()
    .hSet(key, some_value)
    .expire(key, some_expiration)
    .exec();
}
catch (e) {
  if (e instanceof WatchError) {
    // seeing this block get hit often
  }

  throw e;
}

字符串
我注意到在node-redis README中,Transactions部分给出了一个没有调用.watch() * 而没有 * 创建isolatedClient的示例。然而,在does call .watch()的链接示例中,有一个额外的使用executeIsolated方法创建的isolatedClient
使用isolatedClient的含义是什么?如果我们调用.watch(),是否需要使用其中之一?如果是,为什么?如果在.watch().exec()之间使用不同的连接,是否会抛出WatchError

dm7nw8vv

dm7nw8vv1#

redis-server在连接上存储WATCH状态,这意味着并发的WATCHMULTI/EXEC将覆盖彼此的状态.在这种情况下,您需要有一个连接池,每次需要WATCH时,从池中获取一个连接,然后使用它(这正是executeIsolated正在做的):

client.executeIsolated(async isolatedClient => {
  await isolatedClient.watch(key);
  await isolatedClient
    .multi()
    .hSet(key, some_value)
    .expire(key, some_expiration)
    .exec();
});

字符串
您可以通过将isolationPoolOptions选项传递给createClient来配置池行为:

createClient({
  isolationPoolOptions: {
    min: 1,
    max: 100
  }
});


请参阅generic-pool以获取更多选项。

相关问题