最近看了个词觉得有点意思,叫幂等

概念

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。

在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。

幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。

例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现.

定义

在数学里,幂等有两种主要的定义。

在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下仅有两个幂等实数,为0和1。

某一元运算为幂等的时,其作用在任一元素两次后会和其作用一次的结果相同。例如,高斯符号便是幂等的。
一元运算的定义是二元运算定义的特例

二元运算

设S为一具有作用于其自身的二元运算的集合,则S的元素s称为幂等的(相对于)当于s * s = s.

特别的是,任一单位元都是幂等的。若S的所有元素都是幂等的话,则其二元运算 * 被称做是幂等的。例如,联集和交集的运算便都是幂等的。

一元运算

设f为一由X映射至X的一元运算,则f为幂等的,当对于所有在X内的x,

f(f(x)) = f(x)

特别的是,恒等函数一定是幂等的,且任一常数函数也都是幂等的。
注意当考虑一由X至X的所有函数所组成的集合S时。在f在一元运算下为幂等的若且唯若在二元运算下,f相对于其复合运算(标记为o)会是幂等的。这可以写成f o f = f。

—— 百度百科


在现实生活里,比方说我们坐电梯,当我们按了十楼的按钮后,不管之后别的人上来,重复的按,也不会对我们的结果有什么影响,虽然在现实中确实是这样,我们上了电梯后,后来的一些人也会习惯性地再按一遍。

那幂等这个的概念主要是在分布式的应用里体现,比方说订单的支付之类的,主要是避免重复的操作可能会带来的一些不一样的影响,就是为了确保这个影响不管多少次都是一样的。


用知乎上的一个问题来了解应该就更清楚一些了:

分布式高并发系统如何保证对外接口的幂等性?

来自Ivony的回答

幂等与你是不是分布式高并发还有Java EE都没有关系。

关键是你的操作是不是幂等的。

一个幂等的操作典型如:

把编号为5的记录的A字段设置为0

这种操作不管执行多少次都是幂等的。

一个非幂等的操作典型如:

把编号为5的记录的A字段增加1

这种操作显然就不是幂等的。

要做到幂等性,从接口设计上来说不设计任何非幂等的操作即可。

譬如说需求是:

当用户点击赞同时,将答案的赞同数量+1。

改为:

当用户点击赞同时,确保答案赞同表中存在一条记录,用户、答案。赞同数量由答案赞同表统计出来。

来自 vzch 的回答

首先你要知道,分布式高并发并不意味着每个request都处理的很快,也不意味着机器之间就不共享数据了。其次,你可以把你所有带有副作用的task都给一个guid,最后写进数据库之前查一下这个guid是否已经被执行过了。