高併發下接口冪等性的解決方案

#冪等性概念nginx

  冪等(idempotent)是一個數學與計算機學概念,常見於抽象代數中。在編程中,一個冪等操做的特色是其任意屢次執行所產生的影響與執行一次產生的影響相同。redis

  冪等函數,或者冪等方法,是指可使用相同參數重複執行,而且屢次執行所獲取的結果均相。這些函數方法的執行並不會影響系統的狀態sql

#技術方案編程

  一、查詢操做服務器

    查詢一次和查詢屢次,在數據不變的狀況下,查詢結果是同樣的。select是自然的冪等操做。網絡

  二、刪除操做併發

    刪除操做也是冪等的,刪除一次和刪除屢次都是把對應的數據刪除,若是數據已經不在了也不會產生反作用jvm

  ·三、惟一索引ide

    防止新增髒數據。好比:支付寶的資金帳戶,支付寶也有用戶帳戶,每一個用戶只能有一個資金帳戶,如何防止給用戶建立多個資金帳戶,那麼給資金帳戶表中的用戶id加惟一索引函數

    此處要點爲:經過惟一索引或惟一組合索引來防止新增數據時存在髒數據(當表中存在惟一索引時,併發新增必然報錯,此時只須要查詢一下返回結果便可)

  四、token機制

    防止頁面重複提交。業務要求:頁面數據只能被點擊提交一次。發生的緣由:因爲在用戶重複點擊的狀況下或者網絡重發的狀況下,或者nginx重發發送等狀況下會致使數據被重複提交。

    解決方案:集羣採用token加redis(由於redis是單線程的,處理須要排隊);單JVM環境,採用token加redis或token加jvm內存。

    處理流程:一、數據提交前須要向服務器申請token,token放到redis 或jvm內存中,token有效時間;

            二、提交後後臺校驗token,同時刪除token,生成新的token返回。

            三、token特色:要申請,一次有效性,能夠限流。

        ps:redis要用刪除操做來判斷token,刪除成功表明token校驗經過,不建議使用select+delete來校驗,會有併發問題

  五、悲觀鎖

    獲取數據的時候加鎖獲取

       

1 select * from tbl where  id = xxx  for update;

        ps: id字段必定是主鍵或者惟一索引,否則是鎖表,會死人的。悲觀鎖通常伴隨事務一塊兒使用,事務鎖定時間可能會很長,根據實際狀況選用

  六、樂觀鎖

    樂觀鎖只是在更新數據的那一刻鎖表,其它時間不鎖表,因此相對悲觀鎖,效率更高,樂觀鎖的實現方式多種多樣:

      一、經過版本號實現:

        

update tbl set name = xxx,version = version+1 where version = ${version}

      二、經過條件限制

       

update tbl set amount = amount-${amount}  where amount - ${amount} >=0

         要求:quality-¥{subQuality} >= ,這個狀況適合不校驗,適合庫存模型,扣份額和回滾份額,性能更高。

                                                                            ps:未完待續。

相關文章
相關標籤/搜索