redis - 使用 Redis 命令 incr 和 expire 时的竞争条件

标签 redis increment race-condition

基于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/

相关文章:

Redis 出队率在网络上慢 10 倍

c - 尝试创建一个计算值表,从初始值到最终值增加给定数字

python - 复制文件时使用 try/except 或 if/else

c - 将增量应用于 C 中的三元运算符

go - 读取子进程的 stdout 和 stderr 的竞争条件

java - 有什么方法可以保证ElasticSearch索引已被删除

python - 在Python中Unpickling "None"对象

spring - 无法连接到本地 Spring boot 中 docker 上运行的 redis sentinel

azure - Azure Marketplace 中不存在 Redis Cloud

java - += 和 =+ 有什么区别?