Redis中使用WATCH、MULTI、EXEC可能导致事务失败率高

Possibility of high transaction failure rate using WATCH, MULTI, EXEC in Redis

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

我的算法是这样的:

GET key
WATCH key
MULTI
    SET key new_val
EXEC

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

这是正确的吗?有什么办法可以避免这种情况吗?

目前尚不清楚为什么您需要在此处进行交易,除非您在应用程序中执行某些操作并回复 GET key。因此,我假设您将该值用于有意义的事情,否则,您可以放弃事务语义并只调用 SET key new_val.

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

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