我试图调试我的项目中的一些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
?
1条答案
按热度按时间dm7nw8vv1#
redis-server
在连接上存储WATCH
状态,这意味着并发的WATCH
和MULTI
/EXEC
将覆盖彼此的状态.在这种情况下,您需要有一个连接池,每次需要WATCH
时,从池中获取一个连接,然后使用它(这正是executeIsolated
正在做的):字符串
您可以通过将
isolationPoolOptions
选项传递给createClient
来配置池行为:型
请参阅generic-pool以获取更多选项。