首页 > 解决方案 > 在 Redis 中检查并增加一个计数器

问题描述

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

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

我知道我可以使用WATCH,但这是一个乐观锁。我预计每秒会有很多碰撞。这会导致很多失败。也许我可以简单地包装GET一些INCR外部互斥锁。但我不确定它是否足以满足性能要求。

标签: rediscounterincrementrace-condition

解决方案


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

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

  • 唯一的事情是您必须将 INCR 返回值阈值设置为 N+1 以限制 N 次操作,即比 N 多出一个 redis 操作。例如,如果我们希望将操作限制为仅发生 3 次,如果 INCR 返回 4增量后,您将停止进一步操作,因为它已经发生了 3 次。

在此处输入图像描述


推荐阅读