【问题标题】:Check-and-increment a counter in Redis在 Redis 中检查并增加一个计数器
【发布时间】:2019-11-15 20:59:02
【问题描述】:

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

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

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

【问题讨论】:

  • 只需在 Lua 中执行,这将自动发生。
  • 或者把 N 个项目放在一个列表中,然后从列表中删除 BLPOP。

标签: redis counter increment race-condition


【解决方案1】:
  • 您可以在这里安全地使用 Redis INCR
  • INCR 返回增量后的值。

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

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

【讨论】:

  • 如果我 INCRed 当它出现时我不应该这样做,那么我可以用 DECR 跟随它,对吧?
  • 真的很喜欢这个主意。如果我们将初始计数设置为零,N + 1 的值将被自动处理?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
相关资源
最近更新 更多