使用Redis命令INCR和EXPIRE时出现争用情况 [英] A race condition when using Redis command incr and expire
本文介绍了使用Redis命令INCR和EXPIRE时出现争用情况的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
基于redis文档:http://redis.io/commands/incr
在段落模式中:速率限制器2 更短的版本代码:value = INCR(ip) IF value == 1 THEN EXPIRE(ip, 1)
它声称存在使Expire永远不会执行的争用条件。这意味着IP的值可以以某种方式从0反弹到2。
然而,在我看来,既然Redis是单线程的,而incr是一个原始命令,它本身就不应该是原子的吗?即使两个客户端几乎同时执行增量,它们如何都检索0或都检索2?推荐答案
假设您在INCR
命令已经执行之后、EXPIRE
执行之前断开了与Redis服务器的连接。在这种情况下,您永远不会执行EXPIRE
,因为下一次调用代码会给出值1。在redis文档中,使用了术语竞争条件。但这并不是一个成功的任期。更正确的术语是不完美算法。因此,这起案件不是关于两个或更多客户之间的竞争状况,而是关于现实世界中的特殊情况。例如,服务器连接中断。
这篇关于使用Redis命令INCR和EXPIRE时出现争用情况的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文