什么是幂等运算?

什么是幂等运算?


#1楼

无论您调用该操作多少次,结果都是一样的。


#2楼

在计算中,幂等运算是指如果使用相同的输入参数多次调用幂等运算,则不会产生任何其他影响。 例如,从集合中删除项目可以视为对该集合的幂等操作。

在数学中,幂等运算是f(f(x))= f(x)的情况 。 例如, abs()函数是幂等的,因为对于所有x abs(abs(x)) = abs(x)

通过考虑数学定义中的x表示对象的状态,并且f是可以使该对象变异的运算,可以调和这些稍有不同的定义。 例如,考虑Python set及其discard方法。 discard方法从集合中删除一个元素,如果该元素不存在,则不执行任何操作。 所以:

my_set.discard(x)

与执行两次相同的操作具有完全相同的效果:

my_set.discard(x)
my_set.discard(x)

幂等操作通常用于网络协议的设计中,在该协议中,执行一项操作的请求至少会发生一次,但也可能会发生多次。 如果该操作是幂等的,则两次执行此操作不会有任何危害。

有关更多信息,请参见有关幂等性的Wikipedia文章。


上面的答案以前有一些不正确和误导性的例子。以下注释是在2014年4月之前写的,是较旧的版本。


#3楼

只要您传入相同的参数,即使多次调用幂等运算,结果也会在相同的状态下产生。


#4楼

任何第n个结果都将导致输出与第一个结果的值匹配的任何操作。 例如,-1的绝对值为1。-1的绝对值的绝对值为1。-1的绝对值的绝对值的绝对值为1。依此类推。

另请参阅:什么时候使用递归真的很愚蠢?


#5楼

一个集合上的幂等运算在被应用一次或多次后,其成员保持不变。

它可以是绝对值(x)之类的一元运算,其中x属于一组正整数。 这里的absolute(absolute(x))= x。

它可以是二进制运算,就像集合与自身的将始终返回同一集合一样。

干杯


#6楼

幂等运算可以重复任意次,其结果将与仅进行一次相同。 在算术中,将零加到数字上是幂等的。

在“ RESTful” Web服务的上下文中讨论了幂等性。 REST试图最大程度地利用HTTP来使程序访问Web内容,并且通常与基于SOAP的Web服务形成对比,后者只是在HTTP请求和响应中建立远程过程调用样式服务。

REST将Web应用程序组织为“资源”(例如Twitter用户或Flickr图像),然后使用POST,PUT,GET和DELETE的HTTP动词来创建,更新,读取和删除这些资源。

幂等在REST中扮演重要角色。 如果您获取REST资源的表示形式(例如,从Flickr获取jpeg图像),并且操作失败,则可以一次又一次地重复GET,直到操作成功。 对于Web服务,获取图像的次数无关紧要。 同样,如果您使用RESTful Web服务来更新您的Twitter帐户信息,则可以多次输入新信息,以便从Web服务获得确认。 将其放置一千次与放置一次相同。 同样,将REST资源删除一千次与删除一次相同。 因此,幂等性使构建可抵抗通信错误的Web服务变得容易得多。

进一步阅读:Richardson和Ruby 撰写的 RESTful Web服务 (关于幂等性在第103-104页上进行了讨论),以及Roy Fielding的REST博士学位论文 。 Fielding是HTTP 1.1 RFC-2616的作者之一,在第9.1.2节中讨论了幂等性。


#7楼

幂等运算:如果多次执行,则没有副作用。
示例 :从数据资源中检索值并进行打印的操作

非等幂运算:如果多次执行,会造成一定危害。 (因为它们更改了某些值或状态)
示例:从银行帐户提取的操作


#8楼

只是想抛出一个证明幂等的真实用例。 在JavaScript中,假设您正在定义一堆模型类(如在MVC模型中)。 通常实现的方式在功能上等效于以下示例(基本示例):

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

然后,您可以像这样定义新的类:

var User = model('user');
var Article = model('article');

但是,如果您尝试通过model('user')从代码的其他位置获取User类,它将失败:

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

这两个User构造函数将有所不同。 那是,

model('user') !== model('user');

为了使其幂等 ,您只需添加某种缓存机制,如下所示:

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

通过添加缓存,每当您对model('user')进行model('user') ,它将成为同一对象,因此是幂等的。 所以:

model('user') === model('user');

#9楼

我的5c:在集成和网络中,幂等性非常重要。 现实生活中的几个例子:想象一下,我们将数据传递到目标系统。 通过一系列消息传递的数据。 1.如果序列在通道中混合会发生什么? (因为网络软件包总是这样做:))。 如果目标系统是幂等的,结果将不会有所不同。 如果目标系统依赖于顺序中的正确顺序,则我们必须在目标站点上实现重新排序器,这将恢复正确的顺序。 2.如果消息重复,该怎么办? 如果目标系统的通道未及时确认,则源系统(或通道本身)通常会发送该消息的另一个副本。 结果,我们可以在目标系统侧获得重复的消息。 如果目标系统是幂等的,它会照顾好它,结果将不会改变。 如果目标系统不是幂等的,则必须在通道的目标系统侧实现重复数据删除器。


#10楼

幂等操作是可以多次应用的操作,操作或请求,而不会改变结果(即系统状态),超出了最初的应用程序。

示例(Web应用程序上下文):

决定因素:发出多个相同的请求与发出单个请求具有相同的效果。 电子邮件消息系统中的一条消息已打开,并在数据库中标记为“已打开”。 一个人可以多次打开该消息,但是重复执行此操作只会导致该消息处于“打开”状态。 这是一个幂等操作。 第一次使用与资源不匹配的信息(系统状态)PUT对资源进行更新时,系统状态将随着资源更新而改变。 如果一个PUT重复对资源进行相同的更新,则更新中的信息将与每个PUT上已经存在于系统中的信息相匹配,并且不会更改系统状态。 具有相同信息的重复PUT是幂等的:第一个PUT可能会更改系统状态,而后续的PUT则不会。

非强制性:如果某个操作总是引起状态变化,例如一次又一次地向用户发布同一条消息,导致每次都发送新消息并将其存储在数据库中,那么我们就说该操作是非强制性的。

NULLIPOTENT:如果操作没有副作用,例如仅在网页上显示信息而不对数据库进行任何更改(换句话说,您仅在读取数据库),则说该操作为NULLIPOTENT。 所有GET均应无效。

在谈论系统状态时,我们显然忽略了希望的无害和不可避免的影响,例如日志记录和诊断。


#11楼

相当详细和技术性的答案。 只需添加一个简单的定义。

幂等=可重新运行

例如,如果多次执行,则不能保证Create操作本身不会出错。 但是,如果存在操作CreateOrUpdate那么它将声明可重新运行性(Idempotency)。


#12楼

简而言之 ,幂等运算意味着无论您操作幂等运算多少次,该操作都不会导致不同的结果。

例如,根据HTTP规范的定义, GET, HEAD, PUT, and DELETE是幂等操作; 但是POST and PATCH不是。 这就是为什么有时POSTPUT代替的原因。


#13楼

重试安全。

通常是了解其在计算机科学中含义的最简单方法。


#14楼

理解幂等操作的一个很好的例子可能是用遥控钥匙锁定汽车。

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lock是幂等操作。 即使每次lock时都有一些副作用,例如闪烁,汽车仍处于相同的锁定状态。


#15楼

幂等是指一次执行一项操作或多次执行一项操作具有相同的效果。

例子:

  • 乘以零。 无论您执行多少次,结果仍然为零。
  • 设置一个布尔标志。 无论您执行多少次,该标志都会保持设置状态。
  • 从具有给定ID的数据库中删除一行。 如果再次尝试,该行仍然不存在。

对于纯函数 (没有副作用的函数),幂等性意味着f(x)= f(f(x))= f(f(f(x()))= f(f(f(f(x))) )= ......对于x的所有值

对于具有副作用的功能 ,幂等性还意味着在首次应用后不会引起其他副作用。 如果愿意,可以将世界状况视为该函数的附加“隐藏”参数。

请注意,在一个同时进行并行操作的世界中,您可能会发现原来认为是幂等的操作不再如此(例如,在上面的示例中,另一个线程可能会取消设置布尔值的值)。 基本上,只要您具有并发性和可变状态,就需要对幂等性进行更仔细的考虑。

幂等性通常是构建健壮系统的有用属性。 例如,如果存在从第三方接收重复消息的风险,则使消息处理程序充当幂等操作会很有帮助,这样消息效果只会发生一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值