检查并增加 Redis 中的计数器
Check-and-increment a counter in Redis
我有一个手术需要完成N次,不能再多了。该操作由许多接收请求的可能并行进程完成。进程必须检查计数器是否超过 N,如果没有,则递增计数器并执行操作。我想我可以为此使用 Redis 计数器。
但是,如果我只是 GET
然后 INCR
一个值,我可能 运行 进入竞争条件,这将导致操作完成 N 次以上。我如何对 Redis 执行某种 test-and-incr
操作?
我知道我可以使用 WATCH
但那是一个乐观锁。我预计每秒会发生很多次碰撞。这将导致很多失败。也许我可以用某种外部互斥体包装简单的 GET
和 INCR
。但是我不确定它是否足够好。
- 您可以在这里安全地使用 Redis
INCR
。
INCR returns 值 post 增量。
您首先检查由 INCR 编辑的值 return(看是否需要执行 GET)
& 继续根据该值进行操作。
- 唯一的问题是您必须将 INCR return 值阈值设置为 N+1,以限制 N 次操作,即比 N 多一个 redis 操作。
比如我们想限制操作只发生3次,如果INCRreturns 4后自增,那么
你停止做进一步的操作,因为它已经发生了 3 次。
我有一个手术需要完成N次,不能再多了。该操作由许多接收请求的可能并行进程完成。进程必须检查计数器是否超过 N,如果没有,则递增计数器并执行操作。我想我可以为此使用 Redis 计数器。
但是,如果我只是 GET
然后 INCR
一个值,我可能 运行 进入竞争条件,这将导致操作完成 N 次以上。我如何对 Redis 执行某种 test-and-incr
操作?
我知道我可以使用 WATCH
但那是一个乐观锁。我预计每秒会发生很多次碰撞。这将导致很多失败。也许我可以用某种外部互斥体包装简单的 GET
和 INCR
。但是我不确定它是否足够好。
- 您可以在这里安全地使用 Redis
INCR
。 INCR returns 值 post 增量。
您首先检查由 INCR 编辑的值 return(看是否需要执行 GET) & 继续根据该值进行操作。
- 唯一的问题是您必须将 INCR return 值阈值设置为 N+1,以限制 N 次操作,即比 N 多一个 redis 操作。 比如我们想限制操作只发生3次,如果INCRreturns 4后自增,那么 你停止做进一步的操作,因为它已经发生了 3 次。