我使用Only Redis作为我的数据库,我的客户端是ServiceStack.Redis。问题是,如果两个并发请求需要更新一个密钥,那么它可能是竞争条件。例如
A:
B:
如果原点“key”是1000.如果A和B的序列被序列化,则“key”这两个操作的正确结果将是800.但是如果A和B同时发生。在A可以提交之前,操作B从“key”获得值1000,并将900设置为“key”。那不是我想要的。如何防止这种竞争条件,使用“WATCH”?
答案 0 :(得分:10)
你应该阅读Transactions in Redis上的文档,Redis中的事务基本上是对多个操作进行批处理,因此它们作为单个原子操作执行。
由于它只是批处理操作,因此您无法在事务的上下文中执行任何读取操作。在事务开始之前需要检索您需要的任何读取。然后,您可以使用Redis WATCH来监视在事务完成之前不应修改的任何密钥,如果修改了密钥,则事务将失败并且不会处理任何操作。
答案 1 :(得分:0)
@NoobEditor不,仅使用手表无法帮助您解决比赛状况。如果执行的密钥没有被其他人更新,Watch-exec将保证整个批处理都将运行。
利用Redis分布式锁正确处理比赛条件。