亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

關于php高并發解決的一點思路

2020-03-22 18:52:16
字體:
來源:轉載
供稿:網友
涉及搶購、秒殺、抽獎、搶票等活動時,為了避免超賣,那么庫存數量是有限的,但是如果同時下單人數超過了庫存數量,就會導致商品超賣問題。那么我們怎么來解決這個問題呢,我的思路如下(偽代碼): sql1:查詢商品庫存if(庫存數量 > 0) { //生成訂單...
sql2:同時庫存-1}

當沒有并發時,上面的流程看起來是再正常不過了,假設同時兩個人下單,而庫存只有1個了,在sql1階段兩個人查詢到的庫存都是>0的,于是最終都執行了sql2,庫存最后變為-1,超售了,這不是我們想要的結果吧。

解決這個問題比較流行的思路我總結了下:

1. 用額外的單進程處理一個隊列,下單請求放到隊列里,一個個處理,就不會有并發的問題了,但是要額外的開啟后臺進程以及延遲問題,這里暫不予考慮。這里我可使用消息隊列,我們常用到Memcacheq、Radis。 比如:有100張票可供用戶搶,那么就可以把這100張票放到緩存中,讀寫時不要加鎖。 當并發量大的時候,可能有500人左右搶票成功,這樣對于500后面的請求可以直接轉到活動結束的靜態頁面。進去的500個人中有400個人是不可能獲得商品的。所以可以根據進入隊列的先后順序只能前100個人購買成功。后面400個人就直接轉到活動結束頁面。當然進去500個人只是舉個例子,至于多少可以自己調整。而活動結束頁面一定要用靜態頁面,不要用數據庫。這樣就減輕了數據庫的壓力。

2. mysql樂觀鎖,意思是比如總庫存是2,搶購事件提交時,立馬將庫存+1,那么此時庫存是3,然后訂單生成后,在更新庫存前再查詢一次庫存(因為訂單生成理所當然庫存-1,但是先不急,再查一次庫存返回結果是3),看看跟預期的庫存數量(這里預期的庫存是3)是否保持一致,不一致就回滾,提示用戶庫存不足。這里說道悲觀鎖,可能有朋友會問,那一定有樂觀鎖了吧??這里我就淺談下我所了解的悲觀與樂觀鎖了

悲觀鎖與樂觀鎖是兩種常見的資源并發鎖設計思路,也是并發編程中一個非?;A的概念。本文將對這兩種常見的鎖機制在數據庫數據上的實現進行比較系統的介紹。

悲觀鎖(Pessimistic Lock)

悲觀鎖的特點是先獲取鎖,再進行業務操作,即“悲觀”的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業務操作。通常所說的“一鎖二查三更新”即指的是使用悲觀鎖。通常來講在數據庫上的悲觀鎖需要數據庫本身提供支持,即通過常用的select … for update操作來實現悲觀鎖。當數據庫執行select for update時會獲取被select中的數據行的行鎖,因此其他并發執行的select for update如果試圖選中同一行則會發生排斥(需要等待行鎖被釋放),因此達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。

這里需要注意的一點是不同的數據庫對select for update的實現和支持都是有所區別的,例如oracle支持select for update no wait,表示如果拿不到鎖立刻報錯,而不是等待,mysql就沒有no wait這個選項。另外mysql還有個問題是select for update語句執行中所有掃描過的行都會被鎖上,這一點很容易造成問題。因此如果在mysql中用悲觀鎖務必要確定走了索引,而不是全表掃描。

樂觀鎖(Optimistic Lock)

樂觀鎖的特點先進行業務操作,不到萬不得已不去拿鎖。即“樂觀”的認為拿鎖多半是會成功的,因此在進行完業務操作需要實際更新數據的最后一步再去拿一下鎖就好。

樂觀鎖在數據庫上的實現完全是邏輯的,不需要數據庫提供特殊的支持。一般的做法是在需要鎖的數據上增加一個版本號,或者時間戳,然后按照如下方式實現:

1. SELECT data AS old_data, version AS old_version FROM …;2. 根據獲取的數據進行業務操作,得到new_data和new_version3. UPDATE SET data = new_data, version = new_version WHERE version = old_versionif (updated row > 0) { // 樂觀鎖獲取成功,操作完成} else { // 樂觀鎖獲取失敗,回滾并重試}

樂觀鎖是否在事務中其實都是無所謂的,其底層機制是這樣:在數據庫內部update同一行的時候是不允許并發的,即數據庫每次執行一條update語句時會獲取被update行的寫鎖,直到這一行被成功更新后才釋放。因此在業務操作進行前獲取需要鎖的數據的當前版本號,然后實際更新數據時再次對比版本號確認與之前獲取的相同,并更新版本號,即可確認這之間沒有發生并發的修改。如果更新失敗即可認為老版本的數據已經被并發修改掉而不存在了,此時認為獲取鎖失敗,需要回滾整個業務操作并可根據需要重試整個過程。

在此嘮叨總結下這兩個鎖:

1. 樂觀鎖在不發生取鎖失敗的情況下開銷比悲觀鎖小,但是一旦發生失敗回滾開銷則比較大,因此適合用在取鎖失敗概率比較小的場景,可以提升系統并發性能。

2. 樂觀鎖還適用于一些比較特殊的場景,例如在業務操作過程中無法和數據庫保持連接等悲觀鎖無法適用的地方。

3. 根據update結果來判斷,我們可以在sql2的時候加一個判斷條件update table set 庫存=xxx where 庫存>0,如果返回false,則說明庫存不足,并回滾事務。

4. 借助文件排他鎖,在處理下單請求的時候,用flock鎖定一個文件,如果鎖定失敗說明有其他訂單正在處理,此時要么等待要么直接提示用戶"服務器繁忙"。大致代碼如下:

阻塞(等待)模式

$fp = fopen("lock.txt", "w+");if(flock($fp,LOCK_EX)) { // 鎖定當前指針,,,    //..處理訂單    flock($fp,LOCK_UN);}fclose($fp);

非阻塞模式

$fp = fopen("lock.txt", "w+");if(flock($fp,LOCK_EX | LOCK_NB)) {    //..處理訂單    flock($fp,LOCK_UN);} else {  echo "系統繁忙,請稍后再試";}fclose($fp);

5. 如果是分布式集群服務器,就需要一個或多個隊列服務器 小米和淘寶的搶購還是有稍許不同的,小米重在搶的那瞬間,搶到了名額,就是你的,你就可以下單結算。而淘寶則重在付款的時候的過濾,做了多層過濾,比如要賣10件商品,他會讓大于10的用戶搶到,在付款的時候再進行并發過濾,一層層的減少一瞬間的并發量。

6. 使用redis鎖 product_lock_key 為票鎖key 當product_key存在于redis中時,所有用戶都可以進入下單流程。 當進入支付流程時,首先往redis存放sadd(product_lock_key, “1″),如果返回成功,進入支付流程。如果不成,則說明已經有人進入支付流程,則線程等待N秒,遞歸執行sadd操作。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区三区免费视频| 亚洲国产一区二区三区在线观看| 国产精品爽爽爽爽爽爽在线观看| 91亚洲人电影| 日韩中文字幕在线精品| 亚洲欧美资源在线| 国产成人av网址| 国产精品18久久久久久首页狼| 在线观看欧美日韩国产| 国产中文字幕日韩| 美女久久久久久久| 欧美电影在线观看| 亚洲精品丝袜日韩| 国产成人鲁鲁免费视频a| 国产视频亚洲精品| 日韩中文字幕在线精品| 亚洲天堂一区二区三区| 日韩精品中文字幕有码专区| 91在线播放国产| 国产一区二区三区免费视频| 欧美电影电视剧在线观看| 国产xxx69麻豆国语对白| 日韩福利视频在线观看| 91免费视频网站| 亚洲高清不卡av| 欧美大尺度电影在线观看| 一本大道久久加勒比香蕉| 欧美成人一区在线| 国产日韩欧美成人| 国产欧美一区二区三区在线| 在线观看亚洲视频| 国产精品成人一区二区三区吃奶| 久久久综合免费视频| 亚洲精品综合久久中文字幕| 欧美激情亚洲自拍| 国产精品久久久一区| 国产成人精品一区二区| 青草青草久热精品视频在线网站| 久久夜色撩人精品| 亚洲自拍偷拍福利| 欧美精品亚州精品| 亚洲欧美激情四射在线日| 日韩中文字幕久久| 免费91在线视频| 欧美久久精品一级黑人c片| 亚洲欧美另类在线观看| 亚洲免费伊人电影在线观看av| 亚洲情综合五月天| 日本在线观看天堂男亚洲| 亚洲奶大毛多的老太婆| 在线观看视频99| 亚洲欧洲av一区二区| 精品视频久久久| 亚洲精品日韩欧美| 日产日韩在线亚洲欧美| 欧美日韩国产中文字幕| 亚洲欧美日本伦理| 日韩有码在线观看| 亚洲欧美中文日韩v在线观看| 亚洲精品国产精品国自产观看浪潮| 精品一区二区三区四区在线| 欧美亚洲日本网站| 精品美女久久久久久免费| 国产91成人video| 亚洲欧美日韩爽爽影院| 国产午夜精品一区理论片飘花| 国产精品免费小视频| 国内免费久久久久久久久久久| 亚洲成人黄色在线观看| 欧美激情二区三区| 欧美一级淫片aaaaaaa视频| 在线观看日韩www视频免费| 91av网站在线播放| 中文欧美日本在线资源| 国产mv免费观看入口亚洲| 91日本视频在线| 欧美激情videoshd| 隔壁老王国产在线精品| 91九色视频导航| 91在线视频九色| 91亚洲精品久久久久久久久久久久| 日韩精品亚洲视频| 亚洲码在线观看| 在线观看欧美日韩国产| 久久国产精品电影| 成人两性免费视频| 日韩免费精品视频| 精品美女永久免费视频| 国产欧美日韩中文| 国产精品视频地址| 国产视频丨精品|在线观看| 欧美另类极品videosbest最新版本| 精品视频中文字幕| 欧美午夜精品久久久久久久| 欧美精品免费播放| 欧美另类极品videosbestfree| 欧美夫妻性视频| 久久综合88中文色鬼| 亚洲女人初尝黑人巨大| 欧美日韩国产二区| 一区二区三区动漫| 欧美日韩性视频在线| 国产精品国产三级国产专播精品人| 亚洲国产美女久久久久| 高清日韩电视剧大全免费播放在线观看| 久久久亚洲影院你懂的| 亚洲视频国产视频| 欧美亚洲另类制服自拍| 亚洲国产天堂久久综合网| 亚洲欧美国产制服动漫| 国产丝袜高跟一区| 欧美色另类天堂2015| 日韩经典一区二区三区| 久久成人这里只有精品| 一夜七次郎国产精品亚洲| 国产精品久久久久久久久借妻| 亚洲va欧美va国产综合剧情| 亚洲人成在线观看网站高清| 一区二区三区亚洲| 久久久免费高清电视剧观看| 国产精品久久在线观看| 亚洲精品一区久久久久久| 国产亚洲视频在线| 夜夜嗨av一区二区三区免费区| 久热精品视频在线免费观看| 国产一区二区在线播放| 国产精品久久久久高潮| 成人黄色在线免费| 亚洲国产精品一区二区久| 欧美激情一级欧美精品| 97欧美精品一区二区三区| 亚洲女同性videos| 成人做爰www免费看视频网站| 精品久久久久久久久久久久久久| 57pao成人永久免费视频| 欧美日韩亚洲一区二区| 久久成人精品一区二区三区| 亚洲精品久久久久国产| 亚洲人成77777在线观看网| 欧美性高跟鞋xxxxhd| 亚洲第一区第一页| 国产精品日本精品| 国产日本欧美一区二区三区在线| 国产999精品视频| 在线免费观看羞羞视频一区二区| 国产福利视频一区二区| 国产69精品久久久久9999| 91av国产在线| 上原亚衣av一区二区三区| 欧美国产日韩一区二区三区| 成人在线观看视频网站| 日韩在线观看成人| 国产日产久久高清欧美一区| 2019最新中文字幕| 欧美重口另类videos人妖| 一区二区三区高清国产| 亚洲欧美综合图区| 亚洲91av视频| 91久久在线播放| 国产成人精品最新| 不卡伊人av在线播放| 亚洲精品日韩欧美| 亚洲欧美视频在线| 日本一区二区在线免费播放|