根据redis文档:http://redis.io/commands/incr http://redis.io/commands/incr
在段落模式:速率限制器 2
较短的版本代码:
value = INCR(ip)
IF value == 1 THEN
EXPIRE(ip, 1)
据称存在一个竞争条件使 EXPIRE 永远不会执行。这意味着 ip 的值可以以某种方式从 0 跳到 2。
然而在我看来,由于Redis是单线程并且INCR是一个原始命令,它本身不应该是原子的吗?即使 2 个客户端几乎同时执行 INCR,他们怎么可能都检索到 0 或都检索到 2?
想象一下,您在之后断开了与 Redis 服务器的连接INCR
命令已经执行但之前EXPIRE
被处决。在这种情况下你永远不会执行EXPIRE
因为下一次调用代码会给你的值 > 1。在 redis 文档中,术语竞争条件用过的。但这并不是一个成功的术语。更正确的术语是不完善的算法。因此,这个案例不是关于两个或更多客户端之间的竞争条件,而是关于现实世界中的特殊情况。例如,服务器连接丢失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)