什么是幂等操作?

有帮助吗?

解决方案

在计算,等幂操作是具有如果它被称为一次以上以相同的输入参数没有额外的影响。例如,从一组移除项目可以在集被认为是幂等操作。

在数学,等幂操作是其中 F(F(X))= F(x)的。例如,abs()功能幂因为abs(abs(x)) = abs(x)所有x

这些稍微不同的定义可通过考虑 X 在数学定义表示一个对象的状态来调和,并˚F是可以突变该对象的操作。例如,考虑的Python set 及其discard方法。该discard方法删除来自一组的元素,并且不执行任何操作,如果该元素不存在。所以:

my_set.discard(x)

具有完全相同的效果做两次同样的操作:

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

幂等操作通常在网络协议,其中请求执行操作被保证至少发生一次的设计中使用,但也可能发生不止一次。如果操作是幂等的,那么在执行所述操作两次或更多次没有坏处。

请参阅上幂等维基百科文章有关的详细信息。


以上回答以前有一些不正确的和误导的例子。下面的评论2014年4月之前写入指一个较旧的版本。

其他提示

这是幂等的操作可以重复任意次数,其结果将是相同的,就好像它已经做了一次。在算术,加入零到数为幂等的。

幂等被谈论很多的“REST风格的” Web服务的环境。 REST力求最大限度地利用HTTP给节目访问网页内容,并通常在对比度设置为基于SOAP的Web服务,HTTP请求和响应里面只是隧道远程过程调用式的服务。

REST组织web应用到“资源”(如Twitter用户,或一个Flickr图像),然后使用POST的HTTP动词,PUT,GET和DELETE以创建,更新,读取和删除这些资源。

幂等性起着REST重要的作用。如果你得到一个REST资源的表示(例如,从Flickr中获取JPEG图像),并且操作失败,你可以一次又一次地重复,直到GET操作成功。 Web服务,没关系图像多少次得到。同样,如果你使用RESTful Web服务来更新你的Twitter帐户信息,你可以把新的信息很多次,因为它需要以获得从Web服务确认。 PUT-ING它千遍一样PUT-ING一次。同样DELETE-ING一个REST资源千倍相同删除一次。幂等性因此使得人们更方便构建web服务这是弹性的,以通信错误。

进一步阅读: REST Web服务时,由Richardson和红宝石(幂等性是103-104页)上讨论,并在REST 博士论文/ A>。菲尔丁HTTP 1.1,RFC-2616,其在谈到幂等的作者之一节9.1.2

不管你有多少次调用操作,结果将是一样的。

幂等性意味着应用一次操作或多次应用操作具有相同的效果。

例子:

  • 乘以零。无论重复多少次,结果仍然是零。
  • 设置布尔标志。无论您执行多少次,旗帜都会保持不动。
  • 从数据库中删除具有给定 ID 的行。如果您再试一次,该行仍然消失。

为了 纯函数 (没有副作用的函数)那么幂等性意味着 f(x) = f(f(x)) = f(f(f(x))) = f(f(f(f(x)))) = 。 ……对于 x 的所有值

为了 有副作用的函数, ,幂等性还意味着首次应用后不会产生额外的副作用。如果您愿意,您可以将世界状态视为函数的附加“隐藏”参数。

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

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

这是幂等的操作产生的结果在相同的状态,即使你把它超过一次,提供你在相同的参数通过。

只是想扔出去演示幂等一个真正的用例。在JavaScript中,说你定义了一堆模型类(如MVC模型)。这通常被实现的方式在功能上等同于像这样(基本实施例):

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

  return Model;
}

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

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

但是,如果你尝试获得通过Usermodel('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');

这是幂等的操作是这样的操作,动作,或请求可以在不改变结果被施加多次,即,系统的状态下,超出了最初的应用。

实施例(WEB APP CONTEXT):

幂等: 进行多次相同的请求具有如使单个请求相同的效果。在电子邮件消息传递系统的消息被打开,标志着该数据库为“打开”。一个可以打开邮件很多次,但这种重复的动作仅会导致在消息中的“打开”状态。这是一个幂等操作。第一次一个提出的更新,使用不的资源(系统状态)匹配的信息资源时,系统的状态会随着资源被更新。如果一个人提出相同的更新的资源,然后反复在更新的信息将已经匹配信息,在每次放系统,并会出现在系统的状态没有改变。具有相同信息的重复认估期权幂:第一PUT可以改变系统的状态,随后的PUT操作不应该。

NON-幂等: 如果一个操作总是导致状态的改变,像反复张贴相同的消息给用户,从而在每一次数据库发送并存储一个新的消息,我们说的操作是非幂等的。

NULLIPOTENT: 如果操作没有副作用,比如纯粹的没有显示数据库中的任何改变网页上的信息(换句话说,你只能读取数据库),我们说操作NULLIPOTENT。一切又应该是nullipotent。

在谈到我们显然忽略了如日志和诊断希望无害,必然影响系统的状态。

<强>幂等操作:具有如果多次执行没有副作用操作。 点击 示例:一个从一个数据资源检索值和说的操作,将其打印 搜索结果 <强>非幂等操作:操作如果执行多次会造成一定的危害。 (当他们改变一些值或状态) 点击 示例:从银行帐户提取的操作

相当的详情及技术的答案。只是增加一个简单的定义。

  

幂等=重新运行的

例如, 本身Create操作无法得到保证,如果多次执行无差错运行。 但是,如果有一个操作CreateOrUpdate然后它指出重新运行性能(幂等)。

当施加一次或多次,在一组幂等操作离开其成员不变。

它可以像一个一元操作的绝对(x)的其中x属于一个正整数的集合。这里绝对(absolute(X))= X

它可以是例如一组与自身将总是返回相同的组。

联合二进制运算

欢呼声

它是每第n个结果将导致匹配第一结果的值的输出的任何操作。比如-1的绝对值为1 -1的绝对值的绝对值为1的-1绝对值绝对值的绝对值是1等。

另请参阅:当将是一个非常愚蠢的时候使用递归

我5C: 在集成和网络幂等是非常重要的。 从现实生活中的几个例子: 试想一下,我们提供数据到目标系统。数据通过消息的序列递送。 1.将如果序列在信道混合会发生什么? (由于网络数据包总是做:))。如果目标系统是幂等,结果不会有区别。如果目标系统所依赖的序列中的正确的顺序,我们必须实现的目标网站,这将恢复正确的顺序顺器。 2.如果有消息的重复,会发生什么?如果目标系统的信道不及时确认,源系统(或信道本身)通常发送消息的另一拷贝。因此,我们可以对目标系统侧重复的消息。 如果目标系统是幂等的,它需要照顾它和结果不会有区别。 如果目标系统不幂等,我们必须实现对信道的目标系统侧deduplicator。

总之,幂等操作意味着操作不会导致不同的结果,不管你有多少次操作幂等操作。

例如,根据HTTP的规范的定义,GET, HEAD, PUT, and DELETE是幂等的操作;然而POST and PATCH都没有。这就是为什么有时候POST通过PATCH取代。

<强>重试安全的。

通常理解它在计算机科学意义上的最简单的方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top