【问题标题】:Possibility of high transaction failure rate using WATCH, MULTI, EXEC in Redis在 Redis 中使用 WATCH、MULTI、EXEC 的交易失败率可能很高
【发布时间】:2021-06-29 20:21:35
【问题描述】:
我将在 Redis 中存储键值对,但键的数量只有 4 个。由于将有多个进程并行更新值,我计划使用 WATCH、MULTI 和 @ 使用 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 命令。