這篇文章將為大家詳細講解有關php實現并發的方法,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
十載的北流網站建設經驗,針對設計、前端、開發、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。營銷型網站建設的優勢是能夠根據用戶設備顯示端的尺寸不同,自動調整北流建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優雅布局與設計,從而大程度地提升瀏覽體驗。創新互聯公司從事“北流網站設計”,“北流網站推廣”以來,每個客戶項目都認真落實執行。
方案一:使用文件鎖排它鎖
flock函數用于獲取文件的鎖,這個鎖同時只能被一個線程獲取到,其它沒有獲取到鎖的線程要么阻塞,要么獲取失敗
在獲取到鎖的時候,先查詢庫存,如果庫存大于0,則進行下訂單操作,減庫存,然后釋放鎖
方案二:使用MySQL數據庫提供的悲觀鎖
Innodb存儲引擎支持行級鎖,當某行數據被鎖定時,其他進程不能對這行數據進行操作
先查詢并鎖定行:
select stock_num from table where id=1 for update if(stock_num > 0){ //下訂單 update table set stock_num=stock-1 where id=1 }
方案三:使用隊列
將用戶的下單請求依次存入一個隊列中,后臺用一個單獨的進程處理隊列中的下單請求
方案四:使用redis
redis的操作都是原子性的,可以將商品的庫存存入redis中,下單之前對庫存進行decr操作,如果返回的值大于等于0等可以下單,否則不能下單,這種方式效率較高
if(redis->get('stock_num') > 0){ stock_num = redis->decr('stock_num') if(stock_num >= 0){ //下訂單 }else{ //庫存不足 } }else{ //庫存不足 }
其他并發問題:
在現實應用中,很多情況下會把數據存入緩存,當緩存失效時,去數據庫取數據并重新設置緩存,如果這時并發量很大,會有很多進程同時去數據庫取數據,導致很多請求
穿透到數據庫,而使數據庫奔潰,這里可用文件鎖來解決
$data = $cache->get('key'); if(!$data){ $fp = fopen('lockfile'); if(flock($fp, LOCK_EX)){ $data = $cache->get('key');//拿到鎖后再次檢查緩存,這時可能已經有了 if(!$data){ $data = mysql->query(); $cache->set('key', $data); } flock($fp, LOCK_UN); } fclose($fp); }
關于php實現并發的方法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
本文名稱:php實現并發的方法
標題路徑:http://vcdvsql.cn/article26/iijscg.html
成都網站建設公司_創新互聯,為您提供網站制作、品牌網站設計、營銷型網站建設、標簽優化、外貿網站建設、外貿建站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯