1. 程式人生 > >高併發一致性解決方案

高併發一致性解決方案

高併發場景有搶紅包,雙十一搶商品等。

如何去處理這些高併發場景呢?
1.從儲存介質考慮:有記憶體快取和磁碟快取,記憶體快取的速度是比磁碟快取要高出幾十倍的,因此可以考慮儲存介質在記憶體上。想象一下如果搶紅包的時候同時有2萬個請求到達伺服器,我相信使用資料庫來儲存這些紅包資料的話,伺服器會爆掉的,就算不爆掉,請求超時也是意料之中的,因此需要採用記憶體快取的方式來處理這麼多請求,將資料暫時儲存在記憶體中,當紅包搶完的時候再將記憶體中的資料通過事物操作,一次性寫入到資料庫中。
2.從資料一致性考慮:同時有2萬個請求請求紅包,這些請求都是對同一個紅包進行紅包總額的減法操作,因此存在公共資料訪問的併發問題。處理併發問題有兩種方式:第一是悲觀鎖(獨佔鎖),第二是樂觀鎖(可重入鎖)。第一種鎖獨佔鎖是一種阻塞情況最為嚴重的方式,就是給資料加上獨佔鎖,其他執行緒想寫這個資料的話就會被掛起,只有獲取這個資料的執行緒才有許可權寫入這個資料,這樣的話就存在大量執行緒掛起,和競爭鎖的情況對於cpu是極大的消耗,效率低下。
第二種是給資料新增一個版本標識,每當有執行緒對其進行修改那麼就把版本加一,這樣當執行緒進行非原子操作的時候,一開始就儲存了版本號,進行到修改資料的時候比較一下最新的版本號和久版本號是否一樣,一樣就修改不一樣就重試(次數重試和時間重試兩種)。
3.從計算機硬體考慮。單臺伺服器不可靠,壞了一臺就可能導致服務不能使用,因此可採用主從架構或者是哨兵模式。

伺服器使用SpringMVC+spring+myBatis+Redis架構

Redis可以用來進行記憶體快取,獨佔鎖的實現是在sql語句上實現的,對行鎖定。可重入鎖是程式碼實現,判定舊版本號是否和新的一致,不一致重試。