redis實現防止商品超賣現象主要是利用redis的原子性,在判斷是否超賣過程中,最好不要有資料庫查詢這種具有耗時性的操作。
話不多說直接上**
$client
=new
redis()
;$client
->
connect
("127.0.0.1"
,6379
);
第一步:肯定是連線redis
$producttotal=10
;//產品總數
$productoverkey
="pd_test_key"
;$client
->
setnx
($productoverkey,0
);$productover
=$client
->
get(
$productoverkey);
$client
->
watch
($productoverkey
);
第二步:
// 如果賣出的產品數量比總數小則可以執行操作if(
$productover
<
$producttotal
)else
}else
第三步:
博主這裡是利用redis的watch和multi的原子性,當然也可以利用lua指令碼來實現原子性
用ab測試工具測試
ab -c 100 -n 1000
沒有出現超賣現象
ps:
高併發下防止商品超賣的Redis實現
朋友面試被問到高併發下,如何防止10個商品被超賣,當時想到了訊息佇列。我也搜了下,都是推薦記憶體處理秒殺類的高併發搶購,減庫存則是通過非同步的方式寫到資料庫,但是在這之前就已經對秒殺成功的使用者完成了登記。看了的答案,總結大致如下 1.首先定義乙個 redis 佇列名為 sku awards,裡面的...
超賣現象及解決
本專案的超賣類似於電商的秒殺超賣現象 1.不同使用者在讀請求的時候,發現商品庫存足夠,然後同時發起請求,進行秒殺操作,減庫存,導致庫存減為負數。2.同乙個使用者在有庫存的時候,連續發出多個請求,兩個請求同時存在,於是生成多個訂單。對於第一種超賣現象 1 最簡單的方法,更新資料庫減庫存的時候,進行庫存...
秒殺系統防止庫存超賣
第一種 通過資料庫樂觀鎖實現 小型電商 update productstocks set realstock realstock where sku and realstock 0 根據受影響的行數判斷是否執行成功 大型網際網路不是這麼玩的 資料庫有瓶頸 第二種 使用redis 分布式鎖實現 var...