1、簡單處理【update & select 合並】(樂觀鎖)
2、使用redis隊列
實現的方式是用的redis的list隊列,框架為laravel
核心部分為list的pop操作,此操作為原子性,即使很多用戶同時到達,也是依次執行
2.mysql 當mysql單表的數據量大於1000萬行時,建議進行水平分拆。
利用redis的incr、decr的原子性做操作
redis的lpush、rpop的原子性做操作,但是這個只能一個一個的扣,但不能原子地同時扣多個
sql樂觀鎖
二、扣減庫存
安全扣減庫存方案有很多說法,列一下幾個方案和我推薦的方案。
方案一:分布式鎖
有的文章會用redis分布式鎖來做保證扣庫存數量准確的環節,讓點擊結算時,后端邏輯會查詢庫存和扣庫存的update語句同時只有一條線程能夠執行,以商品id為分布式鎖的key,鎖一個商品。但是這樣,其他購買相同商品的用戶將會進行等待。
優點:這樣做雖然安全
缺點:但是失去的是性能問題。
方案二:分布式鎖+分段緩存
也有文章會說借鑒ConcurrenthashMap,分段鎖的機制,把100個商品,分在3個段上,key為分段名字,value為庫存數量。用戶下單時對用戶id進行%3計算,看落在哪個redis的key上,就去取哪個。