結論:雙重reddision鎖+redis的pop操作+失敗回滾機制
1.選擇reddision而不用redis原生鎖是因為reddsion有執行緒排隊等待機制,防止大量的請求因為拿不到鎖而直接導致失敗
2.第一層鎖的目的是過濾掉併發的下單請求,讓拿不到鎖的執行緒排隊等待,key為商品id
3.第二層鎖的目的是過濾掉同乙個人的多次下單請求,防止一人下多單,key為商品id:userid
4.通過redis的pop操作,過濾掉那些在已經售空之後發出的下單請求,減輕資料庫壓力。
5.pop操作不能放在第一層,必須要在鎖的裡面,防止有失敗導致商品回退的情況發生,導致先進來的請求因為沒有等到回退的商品反而搶購失敗。
6.發生異常,則redis和資料庫都進行回滾。此時分兩種情況:
1)pop成功,但是運算元據庫失敗,此時回滾後redis和資料庫中的資料都是正確的
2)pop失敗,此時回滾後redis中的資料會多乙個,但是不影響,因為最終是以資料庫下單成功為準,相當於只是多出來一次無效請求。
7.資料庫是最後一道關卡,update ... where 庫存》0,防止超賣。
04載入秒殺商品實現
當前已經完成了秒殺時間段選單的顯示,那麼當使用者在切換不同的時間段的時候,需要按照使用者所選擇的時間去顯示相對應時間段下的秒殺商品 3.4.1 秒殺服務 查詢秒殺商品列表 restcontroller seckillgoods public class seckillgoodscontroller ...
PHP Redis實現商品秒殺程式
如果你家店裡某商品庫存只有100件,現在店慶活動5折優惠大酬賓,假如現在有200個人瘋狂湧入你家店裡,為了避免發生瘋搶和 件發生,店長您採取了排隊限購的辦法,1人限購1件,排隊先到先買,賣完為止。這個是實體店我們會看到的場景,100件商品,1人1件,最後200人中只有100人能買到商品,剩下100人...
Redis事務和秒殺業務設計
redis事務是乙個單獨的隔離操作 事務中的所有命令都會序列化 按順序地執行。事務在執行的過程中,不會被其他客戶端傳送來的命令請求所打斷,redis事務的主要作用就是串聯多個命令防止別的命令插隊 multi 用於標記事務塊的開始。redis會將後續的命令逐個放入佇列中,然後才能使用exec命令原子化...