redis解决“高并发定时秒杀”库存误差问题
生活随笔
收集整理的這篇文章主要介紹了
redis解决“高并发定时秒杀”库存误差问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言:高并發(fā)的秒殺活動中,通過查詢數(shù)據(jù)庫判斷是否還有庫存,然后對庫存字段進行增減,極易出現(xiàn)庫存超出或者庫存為負(fù)的情況,一般來說有3中解決辦法(數(shù)據(jù)庫表加鎖,memche緩存,redis隊列);
我們這里使用redis來解決問題:
1、思路:
1)觸發(fā)開始開團的同時,把庫存數(shù)量更新到id對應(yīng)的隊列上去(定時更新,或者手動更新)
2)用戶請求接口,如果隊列長度>0,移除一個隊列記錄,同時對數(shù)據(jù)庫進行相應(yīng)操作
3)如果隊列長度<=0,攔截用戶的訪問,返回‘無庫存’
?步驟:
1、后臺準(zhǔn)點插入記錄到redis
$redis = get_redis(); // 1、數(shù)據(jù)庫獲取拼團信息 $sql = "select id,title,surplus_num,high_lines,ku_1,ku_2,ku_3,ku_4 from group_goods"; $arr = getrecord_array($sql);//2、刪除舊redis隊列 foreach ($arr as $key => $value) {//商品id$goods_id = $arr[$key]['id'];$redis->delete('acst_goods_high_lines'.$goods_id); }// 3、準(zhǔn)點插入記錄到redis foreach ($arr as $key => $value) {//商品id$goods_id = $arr[$key]['id'];//庫存數(shù)量$num = $arr[$key]['ku_3'];//json轉(zhuǎn)換$in_list = json_encode($arr[$key]);for ($i=0; $i < $num; $i++) { $redis->lpush('acst_goods_high_lines'.$goods_id,$in_list);} }
2、客戶端搶購
$redis = get_redis(); //獲取隊列長度 $leng = $redis->lLen('acst_goods_high_lines'.$goods_id); if($leng>0){//移除一條記錄$redis->lpop('acst_goods_high_lines'.$goods_id);//減去庫存---增加成功開團數(shù)$sql = "update group_goods set surplus_num = surplus_num-1,mtime = $t,success_num=success_num+20 where id = $goods_id limit 1";exec_db($sql);}else{echojson('已售罄,敬請期待',0); }
?
轉(zhuǎn)載于:https://www.cnblogs.com/wenlei/p/9159736.html
總結(jié)
以上是生活随笔為你收集整理的redis解决“高并发定时秒杀”库存误差问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu关于apt-get remo
- 下一篇: 算术移位的规则及逻辑移动的规则