php mysql 秒杀_redis+PHP实现高并发下秒杀数据入库的问题
在高并發下實現搶購秒殺功能中,我有一個疑問,就是數據入庫的問題,什么時候入庫。
設想思路:
1.判斷他搶購成功了,立馬把生成的訂單數據寫入mysql訂單表,同時庫存表字段減少1;
2.判斷搶購成功后,把用戶的user_id存入到redis的list列表里(比如:order,以user_id為值的列表)。然后再用crontab定時去一個一個插入到mysql訂單表里,同時庫存表字段減少1。
設想結果:
第一種思路,很好理解。簡單的代碼實現如下:
$num=10; //假設庫存量
for($i=0;$i
\Redis::lpush('goods_store',1);//往goods_store列表中,
未搶購之前這里應該是默認push 10個1進去,當然里面的1沒有實際意義
在搶購之前,上面的代碼可以先執行,把商品入隊。
搶購時間到了:(大量用戶請求下面代碼執行操作)
/* 模擬搶購操作,搶購前判斷redis隊列庫存量 */
$count=\Redis::lpop('goods_store');//lpop是原子性的,可以保證不會出現超賣現象。
if(!$count)
return '已經搶光了';
/* 下面處理搶購成功后與mysql數據庫的交互 */
1. //根據規則生成訂單號(order_num),然后把相關的字段數據插入到訂單列表里
$data['order_num'] = *****************;
$data['user_id'] = ***;
$data['goods_id'] = **;
.......
$res = DB::table('order')->insert($data);
2. //減少num庫存字段
if($res)
DB::table('goods')->decrement('num', 1);,
上面的代碼中,當用戶搶購成功后,立馬把相關的訂單數據插入mysql訂單表中,同時庫存減少。現在我的疑問來了,要是用這種思路的話,大并發下,要是多個用戶都同時進入到插入數據到訂單列表和減少商品庫存量這個過程中,是不是也會造成并發操作導致服務器壓力瞬間過大,導致數據入庫不正確呢,比如說存庫少減了一個(還是說根據mysql增刪改查的原子性,并不會造成這樣的錯誤)?。
針對上面搶購成功后,立馬把相關的訂單數據插入mysql訂單表中,同時庫存減少,造成的數據庫服務器壓力過大的問題;
于是有了第二種思路,把用戶的user_id存入到redis列表里(比如:order,以user_id為值的列表),在通過定時器crontab定時去從列表里一個一個取出user_id,生成相關的數據插入到mysql訂單表里,同時庫存表字段減少1。
代碼實現跟上面差不多,
/* 模擬搶購操作,搶購前判斷redis隊列庫存量 */
$count=\Redis::lpop('goods_store');//lpop是原子性的,可以保證不會出現超賣現象。
if(!$count)
return '已經搶光了';
/* 下面處理搶購成功后把user_id存入列表 */
\Redis::lpush('order',user_id);
通過定時器crontab定時去下面的代碼
$user_id = \Redis::rpop('order',user_id);
1. //根據規則生成訂單號(order_num),然后把相關的字段數據插入到訂單列表里
$data['order_num'] = *****************;
$data['user_id'] = $user_id;
$data['goods_id'] = **;
.......
$res = DB::table('order')->insert($data);
2. //減少num庫存字段
if($res)
DB::table('goods')->decrement('num', 1);,
第二種思路,我的疑問是,要是搶購成功后,先把user_id存入隊列,再用定時器每隔一段時間去隊列里取數據,然后生成相關的數據插入的mysql訂單表里,同時減少庫存。這樣是可以減輕數據庫服務器的壓力了。但是我的搶購流程是這么設計的,用戶搶購成功后,彈出//去支付按鈕//進入訂單列表頁面(訂單列表頁數據是從mysql讀取出來的),由于使用定時器去執行生成訂單數據然后再插入到mysql數據庫,這個過程肯定會有延遲,要是用戶此時通過//去支付按鈕//進入訂單列表頁面,發現訂單列表還沒有生成訂單數據,那不是很悲催嗎?
【這樣設計搶購流程是否合理,是不是不用進入到訂單列表,直接點擊去支付,支付成功后,才生成訂單數據插入到數據庫呢】
以上就是我對兩種思路存在的疑惑,希望可以得到專業人士的講解,或者一起探討。
總結
以上是生活随笔為你收集整理的php mysql 秒杀_redis+PHP实现高并发下秒杀数据入库的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 滤波器开发之五:基于算术平均的限幅滤波器
- 下一篇: STM32F0使用LL库实现DMA方式A