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

All*_*ang 9 redis servicestack servicestack.redis

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

A:

  1. int a =获取密钥

  2. a = a - 100
  3. 设置键a
  4. EXEC

B:

  1. int a =获取密钥

  2. a = a - 100
  3. 设置键a
  4. EXEC

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

myt*_*thz 10

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

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