检查并增加Redis中的计数器

检查并增加Redis中的计数器,redis,counter,increment,race-condition,Redis,Counter,Increment,Race Condition,我有一个手术,我需要做N次,不再做了。该操作由接收请求的许多可能的并行进程完成。进程必须检查计数器是否超过N,如果没有,则增加计数器并执行操作。我想我可以用一个Redis计数器 但是,如果我只是GET然后INCR一个值,我可能会遇到竞争条件,这将导致操作被执行N次以上。如何对Redis执行某种类型的测试和incr操作 我知道我可以使用手表,但这是一个乐观的选择。我预计每秒会有很多碰撞。这将导致许多失败。也许我可以用某种外部互斥来包装简单的GET和INCR。但我不确定它的性能是否足够好。 您可以在

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

但是,如果我只是
GET
然后
INCR
一个值,我可能会遇到竞争条件,这将导致操作被执行N次以上。如何对Redis执行某种类型的
测试和incr
操作

我知道我可以使用
手表
,但这是一个乐观的选择。我预计每秒会有很多碰撞。这将导致许多失败。也许我可以用某种外部互斥来包装简单的
GET
INCR
。但我不确定它的性能是否足够好。

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

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

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

只需在Lua中执行,这将以原子方式发生。或者将N个项目放入列表中,然后从列表中删除。如果我在不应该添加的时候添加了,那么我可以使用
DECR
,对吗?我非常喜欢这个想法。如果我们将初始计数设置为零,那么N+1值将自动处理?