关于幂等

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

概念

幂等(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是否已经被执行过了。


拓展阅读

编程中的幂等性 — HTTP幂等性

What is idempotence?

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

订单交易系统中的幂等设计

利用幂等性区分HTTP的POST与PUT请求

幂等性是指对同一操作的多次执行所产生的结果与一次执行的结果相同。在计算机科学中,幂等性是一种重要的概念,它可以确保系统在面对重复请求时能够保持一致性和可靠性。幂等性在许多领域都有应用,包括分布式系统、网络通信和数据库操作等。 鲁棒性是指系统在面对异常情况或者不符合预期的输入时,仍然能够保持稳定性和正确性的能力。鲁棒性是许多学科的核心问题,包括生物学、药学、社会科学、经济学、生态学和工程学等。在生物学和药学中,鲁棒性可以帮助我们理解为什么一些基因突变会引发疾病,而另一些却不能。在社会科学和经济学中,鲁棒性关系到人类社会和组织在面对各种变化和挑战时的稳定性。在生态学和环境科学中,鲁棒性是预测人类活动对生态系统影响的重要问题。在工程学中,鲁棒性是设计可靠系统的最终目标,使其在面对组件故障时仍能正常运行。 引用\[1\]和\[2\]提供了关于鲁棒性在不同学科中的重要性和应用。引用\[3\]则提到了在编程中保证鲁棒性的一种常见做法,即进行判空和有效性检查,并将异常传导到业务层进行处理。 综上所述,幂等性和鲁棒性都是计算机科学中重要的概念。幂等性确保系统在面对重复请求时能够保持一致性和可靠性,而鲁棒性则是系统在面对异常情况时能够保持稳定性和正确性的能力。这两个概念在不同领域都有广泛的应用和重要性。 #### 引用[.reference_title] - *1* [网络鲁棒性](https://blog.csdn.net/LaZiv/article/details/114389348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [关于鲁棒性的思考](https://blog.csdn.net/qqpopxx/article/details/117569806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值