【问题标题】:Possibility of high transaction failure rate using WATCH, MULTI, EXEC in Redis在 Redis 中使用 WATCH、MULTI、EXEC 的交易失败率可能很高
【发布时间】:2021-06-29 20:21:35
【问题描述】:

我将在 Redis 中存储键值对,但键的数量只有 4 个。由于将有多个进程并行更新值,我计划使用 WATCHMULTI 和 @ 使用 Redis 事务987654323@ 命令。

我的算法是这样的:

GET key
WATCH key
MULTI
    SET key new_val
EXEC

我主要担心的是,由于WATCH使用乐观锁,当我会有多个进程(远远超过键的数量,只有4个)尝试更新值时,事务失败率会非常高.

这是正确的吗?有没有办法防止这种情况发生?

【问题讨论】:

    标签: redis transactions race-condition


    【解决方案1】:

    除非您在应用程序中做某事并回复GET key,否则不清楚为什么您需要在此处进行事务处理。因此,我假设您将值用于有意义的事情,否则,您可以删除事务语义并调用 SET key new_val

    乐观锁定主要用于资源争用较少的情况。由于您描述的用例显然相反,因此可能会导致高故障率。这并不是说 Redis 和您的应用程序将无法工作,但这确实意味着可能会浪费大量精力。

    如果可能,我建议您考虑切换到使用 Redis 的服务器端 Lua 脚本。这些是阻塞的、原子的,可让您以编程方式读取和有意义地操作 Redis 中的数据。有关详细信息,请参阅EVAL 命令。

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2021-04-01
      • 2013-12-22
      • 2012-06-24
      • 1970-01-01
      • 2020-11-08
      相关资源
      最近更新 更多