基于redis文档:http://redis.io/commands/incr
在段落中 Pattern: Rate Limiter 2 更短的版本代码:
value = INCR(ip) IF value == 1 THEN EXPIRE(ip, 1)
据称存在使 EXPIRE 永远不会执行的竞争条件。这意味着 ip 的值可以通过某种方式从 0 反弹到 2。
但是在我看来,Redis 是单线程的,INCR 是原始命令,它本身不应该是原子的吗?即使 2 个客户端几乎同时执行 INCR,他们怎么可能都检索到 0 或都检索到 2?
最佳答案
想象一下,您在 INCR
命令已经执行但在 EXPIRE
执行之前断开与 redis 服务器的连接。在这种情况下,您永远不会执行 EXPIRE
,因为下一次代码调用会给出您的值 > 1。在 Redis 文档中,使用了术语 race condition。但它不是成功的术语。更正确的说法是不完美的算法。所以这个案例不是关于 2 个或更多客户之间的竞争条件,而是关于现实世界中的特殊情况。例如服务器连接丢失。
关于redis - 使用 Redis 命令 incr 和 expire 时的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20725262/