【发布时间】:2019-11-15 20:59:02
【问题描述】:
我有一个手术需要完成 N 次,不能再做。该操作由接收请求的许多可能并行的进程完成。进程必须检查计数器是否超过 N,如果没有,则增加计数器并执行操作。我想我可以为此使用 Redis 计数器。
但是,如果我只是 GET 然后 INCR 一个值,我可能会遇到竞争条件,这将导致操作完成 N 次以上。如何对 Redis 执行某种test-and-incr 操作?
我知道我可以使用WATCH,但这是一个乐观锁。我预计每秒会有很多碰撞。这会导致很多失败。也许我可以用某种外部互斥锁包装简单的GET 和INCR。但我不确定它是否足以提高性能。
【问题讨论】:
-
只需在 Lua 中执行,这将自动发生。
-
或者把 N 个项目放在一个列表中,然后从列表中删除 BLPOP。
标签: redis counter increment race-condition