14

我只使用 Redis 作为我的数据库,我的客户是 ServiceStack.Redis。问题是,如果两个并发请求需要更新一个键,那么它可能是一个竞争条件。例如

A:

  1. int a = 获取密钥

  2. a = a - 100
  3. 设置密钥 a
  4. 执行

乙:

  1. int a = 获取密钥

  2. a = a - 100
  3. 设置密钥 a
  4. 执行

如果origin“key”是1000。如果speration A和B被序列化,那么“key”这两个操作的正确结果是800。但是如果A和B同时发生。在 A 可以提交之前,操作 B 从“key”中获取值 1000,并将 900 设置为“key”。那不是我想要的。如何防止这种竞争条件,使用“WATCH”?

4

2 回答 2

16

您应该阅读有关Redis 中的事务的文档,Redis中的事务本质上是批处理多个操作,因此它们作为单个原子操作执行。

由于它只是批处理操作,因此您无法在事务的上下文中执行任何读取。您之前需要的任何读取都需要在事务开始之前检索。然后,您可以使用Redis WATCH监视在事务完成之前不应修改的任何键,如果修改了键,则事务将失败并且不会处理任何操作。

于 2015-02-14T08:52:50.863 回答
0

@NoobEditor 不,仅使用 watch 不会帮助您解决比赛条件。Watch-exec 将保证如果监视的密钥没有被其他人更新,则整个批处理将运行。

使用 Redis 分布式锁来正确处理竞争条件。

于 2020-10-23T09:50:06.587 回答