日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis解决“高并发定时秒杀”库存误差问题

發布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis解决“高并发定时秒杀”库存误差问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:高并發的秒殺活動中,通過查詢數據庫判斷是否還有庫存,然后對庫存字段進行增減,極易出現庫存超出或者庫存為負的情況,一般來說有3中解決辦法(數據庫表加鎖,memche緩存,redis隊列);

我們這里使用redis來解決問題:

1、思路:

  1)觸發開始開團的同時,把庫存數量更新到id對應的隊列上去(定時更新,或者手動更新)

  2)用戶請求接口,如果隊列長度>0,移除一個隊列記錄,同時對數據庫進行相應操作

  3)如果隊列長度<=0,攔截用戶的訪問,返回‘無庫存’

?步驟:

1、后臺準點插入記錄到redis

$redis = get_redis(); // 1、數據庫獲取拼團信息 $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、準點插入記錄到redis foreach ($arr as $key => $value) {//商品id$goods_id = $arr[$key]['id'];//庫存數量$num = $arr[$key]['ku_3'];//json轉換$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);//減去庫存---增加成功開團數$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); }

?

轉載于:https://www.cnblogs.com/wenlei/p/9159736.html

總結

以上是生活随笔為你收集整理的redis解决“高并发定时秒杀”库存误差问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。