【问题标题】:Stackexchange.redis lacks the "WAIT" supportStackexchange.redis 缺乏“等待”支持
【发布时间】:2019-09-10 13:10:36
【问题描述】:

我在客户端应用程序正在使用的负载平衡器后面有 3 个 Web api 服务器。 我正在使用这个库来访问具有一个主控和几个从属的 redis 集群。 当前不支持“等待”操作,我需要此功能来存储新创建的用户会话并等到它复制到所有从属设备以确保所有来自客户端的后续传入呼叫都可以读取会话(可以来从我的其他应用程序服务器)不会失败(因为它可以尝试从 redis 从站读取密钥)。

为此类实施寻找一些最佳实践。

【问题讨论】:

    标签: c# redis stackexchange.redis


    【解决方案1】:

    WAIT本质上是一个阻塞操作,它违反了库所依赖的连接共享编程模型(查看更多here)。所以不,这没有暴露。

    我们正在讨论允许更通用的池/租赁模型以及默认共享模型的想法,但现在:这不存在。但这就是使阻塞命令“安全”的原因。

    您可以通过 Execute 手动发出它,但如果您这样做:您只能靠自己;如果它爆炸或引起任何问题......玩得开心!


    以下不支持(本质上它发出阻塞操作),但如果它有效 - 它有效;如果它导致问题 - 它会导致问题:

    var tran = db.CreateTransaction();
    _ = tran.StringSetAsync("mykey", cacheItem);
    _ = tran.ExecuteAsync("wait", 2);
    tran.Execute();
    

    【讨论】:

    • 我看到了暴露的 Execute 方法,但找不到任何如何使用它的示例——一般来说,特别是对于 WAIT。你能告诉我这样的例子吗?我打算用它做一些测试——它只需要非常具体的用途
    • @Liran 类似于 db.Execute("WAIT", 2);(第二个参数是 args),但是:不支持发出阻塞操作:无论接下来发生什么:发生
    • @MarcGravell 如果我们创建 ConnectionMultiplexer 的新实例并在该实例中执行 Set+Wait 操作,它可能会给系统中使用不同对象的其他地方带来问题吗?
    • @liraz 只是为了“长尾”(即其他读者),我们通过 GitHub 讨论过,答案是“今天不要这样做,它会伤害你,但是:我们是正在努力”:github.com/StackExchange/StackExchange.Redis/issues/…
    【解决方案2】:

    终于解决了 - 缺少等待的参数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-02
      • 2011-06-03
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多