如何使用Redis防止竞争条件?

时间:2015-02-14 08:44:16

标签: redis servicestack servicestack.redis

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

A:

  1. int a =获取密钥
  2. MULTI
  3. a = a - 100
  4. 设置键a
  5. EXEC
  6. B:

    1. int a =获取密钥
    2. MULTI
    3. a = a - 100
    4. 设置键a
    5. EXEC
    6. 如果原点“key”是1000.如果A和B的序列被序列化,则“key”这两个操作的正确结果将是800.但是如果A和B同时发生。在A可以提交之前,操作B从“key”获得值1000,并将900设置为“key”。那不是我想要的。如何防止这种竞争条件,使用“WATCH”?

2 个答案:

答案 0 :(得分:10)

你应该阅读Transactions in Redis上的文档,Redis中的事务基本上是对多个操作进行批处理,因此它们作为单个原子操作执行。

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

答案 1 :(得分:0)

@NoobEditor不,仅使用手表无法帮助您解决比赛状况。如果执行的密钥没有被其他人更新,Watch-exec将保证整个批处理都将运行。

利用Redis分布式锁正确处理比赛条件。