對於商品搶購等併發場景下,可能會出現超賣的現象,這時就需要解決併發所帶來的這些問題了
在php
語言中並沒有原生的提供併發的解決方案,因此就需要借助其他方式來實現併發控制。
方案一:使用檔案鎖排它鎖
flock函式用於獲取檔案的鎖,這個鎖同時只能被乙個執行緒獲取到,其它沒有獲取到鎖的執行緒要麼阻塞,要麼獲取失敗
在獲取到鎖的時候,先查詢庫存,如果庫存大於0,則進行下訂單操作,減庫存,然後釋放鎖
方案二:使用mysql資料庫
提供的悲觀鎖
innodb儲存引擎支援行級鎖,當某行資料被鎖定時,其他程序不能對這行資料進行操作
先查詢並鎖定行:select stock_num from table where id=1 for update
if (stock_num > 0)
方案三:使用佇列
將使用者的下單請求依次存入乙個佇列中,後台用乙個單獨的程序處理佇列中的下單請求
方案四:使用redis
redis的操作都是原子性的,可以將商品的庫存存入redis中,下單之前對庫存進行decr操作,如果返回的值大於等於0等可以下單,否則不能下單,這種方式效率較高
if (redis - > get('stock_num') > 0) else
} else
其他併發問題:
在現實應用中,很多情況下會把資料存入快取,當快取失效時,去資料庫取資料並重新設定快取,如果這時併發量很大,會有很多程序同時去資料庫取資料,導致很多請求
穿透到資料庫,而使資料庫奔潰,這裡可用檔案鎖來解決
$data = $cache - > get('key');
if (!$data)
flock($fp, lock_un);
}fclose($fp);
}
redis的併發問題處理
簡單模擬下redis併發的場景 建立2個檔案1.php,2.php,內容如下 redis new redis redis connect 127.0.0.1 price redis get price sleep 10 price price 10 redis set price price pri...
nodejs處理高併發問題
做了乙個nodejs併發測試,先描述一下環境 資料庫mysql,大概兩張表,讀取第一張表test的資料,拿出來 1,存到第二張testlog表記錄一下,用jmeter同事模擬50個請求,結果發現,部分資料沒有 1成功 test 表資料id num desc 1942017 02 2814 41 17...
elastic job的併發問題和處理
elasticjob資料要自己分片,如果多個分片執行同乙個任務要注意冪等性 舉乙個簡單的例子 如果讓兩個分片執行同乙個任務 如先刪除後新增,很容易就出現有些類似不可重複讀的問題 會發現插入兩條資料 這是由於兩台機器同時觸發任務,造成的併發問題 處理方式 這裡當然可以用分片處理,但是有時候我們需要在某...