用索引來實現冪等

2021-07-13 15:28:01 字數 2244 閱讀 4435

隨著大資料的到來,分布式處理變得越來越火,而且分布式中的一致性事務又是重中之重。當然我們今天的重點不在於介紹如何保證分布式事務中的一致性,而是在保證事務一致性的過程中會出現一系列的補償機制,這就涉及到了冪等。接下來讓我們一起去看一下吧。

在程式設計中.乙個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函式,或冪等方法,是指可以使用相同引數重複執行,並能獲得相同結果的函式。這些函式不會影響系統狀態,也不用擔心重複執行會對系統造成改變。

在實際應用中,最常用的就是去重。

插入資料的唯一索引
插入資料的唯一性,可以通過業務主鍵來進行約束,例如乙個特定的業務場景,三個字段肯定確定唯一性,那麼,可以在資料庫表新增唯一索引來進行標示。

如果涉及到的去重的地方特別多,例如erp系統中有各種各樣的業務單據,每一種業務單據都需要去重,這時候,可以單獨搞一張去重表,在插入資料的時候,插入去重表,利用資料庫的唯一索引特性,保證唯一的邏輯。

分布式鎖
還是拿插入資料的例子,如果是分布是系統,構建唯一索引比較困難,例如唯一性的字段沒法確定,這時候可以引入分布式鎖,通過第三方的系統,在業務系統插入資料或者更新資料,獲取分布式鎖,然後做操作,之後釋放鎖,這樣其實是把多執行緒併發的鎖的思路,引入多多個系統,也就是分布式系統中得解決思路。

狀態機冪等
在設計單據相關的業務,或者是任務相關的業務,肯定會涉及到狀態機,就是業務單據上面有個狀態,狀態在不同的情況下會發生變更,一般情況下存在有限狀態機,這時候,如果狀態機已經處於下乙個狀態,這時候來了乙個上乙個狀態的變更,理論上是不能夠變更的,這樣的話,保證了有限狀態機的冪等。

在關聯式資料庫中,索引是一種與表有關的資料庫結構,它可以使對應於表的sql語句執行得更快。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。

唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。 當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在 employee 表中職員的姓 (lname) 上建立了唯一索引,則任何兩個員工都不能同姓。

非唯一索引
非唯一索引是相對唯一索引,允許其中任何兩行具有相同索引值的索引。 當現有資料中存在重複的鍵值時,資料庫是允許將新建立的索引與表一起儲存。這時資料庫不能防止新增將在表中建立重複鍵值的新資料。

主鍵索引
資料庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。 在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。

聚集索引(也叫聚簇索引)
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能包含乙個聚集索引。 如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。

大大加快資料的檢索速度;
建立唯一性索引,保證資料庫表中每一行資料的唯一性;
加速表和表之間的連線;
在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。
4、缺點

索引需要佔物理空間。
當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。
我們了解了索引之後就能實現冪等了,從而可以避免重複插入。這在電商或者其他的專案中,處理重複的訂單就簡單多了。當然,我們利用資料庫的唯一索引來實現冪等只是其中的一種方法,在其他情況下,我們還可以通過其他方法來做冪等,這裡不再敘說,以後遇到再與大家分享。

sphinx增量索引和主索引來實現索引的實時更新

專案中文章的資訊內容因為持續有新增,而文章總量的基數又比較大,所以做搜尋的時候,用了主索引 增量索引這種方式來實現索引的實時更新。實現原理 1.新建一張表,記錄一下上一次已經建立好索引的最後一條記錄的id 2.當索引時,然後從資料庫中取出所有id大於上面那個sphinx中的那個id的資料,這些就是新...

sphinx增量索引和主索引來實現索引的實時更新

專案中文章的資訊內容因為持續有新增,而文章總量的基數又比較大,所以做搜尋的時候,用了主索引 增量索引這種方式來實現索引的實時更新。實現原理 1.新建一張表,記錄一下上一次已經建立好索引的最後一條記錄的id 2.當索引時,然後從資料庫中取出所有id大於上面那個sphinx中的那個id的資料,這些就是新...

sphinx增量索引和主索引來實現索引的實時更新

專案中文章的資訊內容因為持續有新增,而文章總量的基數又比較大,所以做搜尋的時候,用了主索引 增量索引這種方式來實現索引的實時更新。實現原理 1.新建一張表,記錄一下上一次已經建立好索引的最後一條記錄的id 2.當索引時,然後從資料庫中取出所有id大於上面那個sphinx中的那個id的資料,這些就是新...