关于使用StackExchange.Redis的事务,我有几个问题:

  • 是否允许在可能在群集环境中针对不同节点的事务中执行命令?说,第一个命令的键具有{1}主题标签,第二个命令的键具有{2}主题标签。
  • 事务的Execute()/ExecuteAsync()什么时候返回false?只有在不满足设定条件的情况下?如果没有设置条件,它可以返回false吗?
  • 如果发生某些网络错误或内部Redis错误,Execute()/ExecuteAsync()会抛出还是只是返回false?我是否还应该检查命令的任务(假设命令是完全正确的,并且通常不希望抛出),否则它们将被取消?

  • 不幸的是the doc没有详细解释#2和#3。

    最佳答案

    我已经深入研究了StackExchange.Redis源代码并使用了驱动程序,这是我的观察结果:

  • ITransaction实例
  • 上调用op方法时,没有实际的交互发生
  • 驱动程序仅在您调用Execute()/ExecuteAsync()
  • 时才开始与Redis对话

    答案似乎如下:
  • 如@ royi-mindel所述,事务中的所有键都必须针对同一插槽。否则,您将收到“多键操作必须包含一个插槽”异常。
  • Execute()/ExecuteAsync()在两种情况下返回false:当由于不满足条件而放弃事务时,以及驱动程序无法使命令排队时(例如由于服务器OOM)。所有命令任务将被标记为已取消。同样,如果其中一个命令在执行过程中失败(例如,由于错误的类型操作),则Execute()/ExecuteAsync() 不会返回false
  • 如果发生某些网络问题,Execute()/ExecuteAsync()将引发异常,所有命令任务将保持“等待激活”状态。

  • 综上所述,仅当Execute()/ExecuteAsync()返回true时,才应检查命令任务:每个任务将包含结果或错误(请参见Exception属性)。

    关于c# - StackExchange.Redis:有关交易的几个问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48711230/

    10-15 10:01