立即秒殺(慕課秒殺)

2021-09-29 06:43:41 字數 2484 閱讀 9711

前端function():

function doseckill() ,

success: function (data)  else 

},error: function ()

在開發高併發系統時有三把利器用來保護系統:快取、降級和限流

後端**:

//基於令牌桶演算法的限流實現類,表示最大許可數是10

ratelimiter ratelimiter = ratelimiter.create(10);

// 嘗試獲取乙個許可,最多等待timeout時間

if (!ratelimiter.tryacquire(1000, timeunit.milliseconds))

//記憶體標記,減少redis訪問

boolean over = localovermap.get(goodsid);

if (over)

//預減庫存(將redis中的庫存數減一,但資料庫中的庫存數未減少)

long stock = redisservice.decr(goodskey.getgoodsstock, "" + goodsid);//10

//當redis中的庫存小於0的時候

if (stock < 0)

}

@override

public void afterpropertiesset()

for (goodsvo goods : goodsvolist)

}

//判斷重複秒殺,如果redis中有相同的手機號與訂單則為重複秒殺

seckillorder order = orderservice.getorderbyuseridgoodsid(user.getid(), goodsid);

if (order != null)

//最後用rabbitmq非同步下單,最後才會訪問資料庫,這樣做是為了最大力度減少對資料庫的訪問。

//入隊

seckillmessage message = new seckillmessage();

message.setuser(user);

message.setgoodsid(goodsid);

sender.sendseckillmessage(message);

return result.success(0);//排隊中

@rabbitlistener(queues=mqconfig.queue)

public void receive(string message)

//判斷重複秒殺

seckillorder order = orderservice.getorderbyuseridgoodsid(user.getid(), goodsid);

if(order != null)

//減庫存 下訂單 寫入秒殺訂單

seckillservice.seckill(user, goodsvo);

}

//保證這三個操作,減庫存 下訂單 寫入秒殺訂單是乙個事物

@transactional

public orderinfo seckill(user user, goodsvo goods)else

}

/**

* 減少庫存,每次減一

* * @return

*/public boolean reducestock(goodsvo goods) catch (exception e)

if (ret != 0)

//update語句影響條數》0

break;

//迴圈,如果請求大於五次結束,最後判斷有沒有更新資料庫

} while (numattempts < default_max_retries);

return ret > 0;

}

//stock_count > 0 和 版本號實現樂觀鎖 防止超賣

@update("update sk_goods_seckill set stock_count = stock_count - 1, version= version + 1 where goods_id = # and stock_count > 0 and version = #")

public int reducestockbyversion(seckillgoods seckillgoods)

/**

* 因為要同時分別在訂單詳情表和秒殺訂單表都新增一條資料,所以要保證兩個操作是乙個事物

*/@transactional

public orderinfo createorder(user user, goodsvo goods)

秒殺 秒殺系統 優化之路

1 im系統,例如qq或者微博,每個人都讀自己的資料 好友列表 群列表 個人資訊 2 微博系統,每個人讀你關注的人的資料,乙個人讀多個人的資料 3 秒殺系統,庫存只有乙份,所有人會在集中的時間讀和寫這些資料,多個人讀乙個資料。例如 小公尺手機每週二的秒殺,可能手機只有1萬部,但瞬時進入的流量可能是幾...

電商秒殺專案 秒殺模組

itemmodel中新增乙個 private promomodel promomodel 並建立get set方法。修改getitembyid方法 override public itemmodel getitembyid integer id itemmodel itemmodel convert...

秒殺系統 流量削峰技術 秒殺令牌

生成秒殺令牌 override public string generatesecondkilltoken integer promoid,integer itemid,integer userid if promomodel.getstarttime isafternow else if prom...