使用Redis命令INCR和EXPIRE时出现争用情况 [英] A race condition when using Redis command incr and expire

查看:35
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆