最近看了個詞覺得有點意思,叫冪等。
概念
冪等(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是否已經被執行過了。