在 Redis 中检查并递增计数器

Ghe*_*man 4 counter increment race-condition redis

我有一个手术需要做 N 次,不能再多了。该操作由许多接收请求的可能并行进程完成。进程必须检查计数器是否超过 N,如果没有,则增加计数器并执行操作。我想我可以为此使用 Redis 计数器。

但是,如果我只是GET然后INCR一个值,我可能会遇到竞争条件,这将导致操作进行 N 次以上。如何test-and-incr对 Redis执行某种操作?

我知道我可以使用,WATCH但这是一个乐观锁。我预计每秒钟都会发生很多碰撞。这会导致很多失败。也许我只是包装简单GET,并INCR具有某种外部互斥的。但我不确定它是否足以满足性能。

Dhr*_*hak 5

  • 您可以INCR在这里安全地使用Redis 。
  • INCR 返回增量后的值。

  • 您首先检查 INCR 返回的值(请参阅无需执行 GET )并根据该值继续执行操作。

  • 唯一的问题是您必须将 INCR 返回值阈值设置为 N+1 以限制为 N 个操作,即比 N 个额外的 redis 操作。例如,如果我们想限制操作仅发生 3 次,如果 INCR 返回 4递增后,您将停止执行进一步操作,因为它已经发生了 3 次。

在此处输入图片说明