生成秒殺令牌
@override
public string generatesecondkilltoken(integer promoid, integer itemid, integer userid)
if (promomodel.getstarttime().isafternow()) else if (promomodel.getendtime().isbeforenow()) else
// 1. 判斷活動是否正在進行
if (promomodel.getstatus().intvalue() != 2)
// 2. 校驗商品資訊和使用者資訊
itemmodel itemmodel = itemservice.getitembyidincache(itemid);
if (itemmodel == null)
usermodel usermodel = userservice.getuserbyidincache(userid);
if (usermodel == null)
// 3. 生成秒殺令牌,並存入 redis 中
string token = uuid.randomuuid().tostring().replace("-", "");
redistemplate.opsforvalue().set("promo_token_" + promoid + "_userid_" + userid + "_itemid_" + itemid, token);
redistemplate.expire("promo_token_" + promoid + "_userid_" + userid + "_itemid_" + itemid, 5, timeunit.minutes);
return token;
}
增加生成秒殺令牌的介面
@responsebody
public commonreturntype generatetoken(@requestparam(name = "itemid") integer itemid,
@requestparam(name = "promoid") integer promoid) throws busines***ception
usermodel usermodel = (usermodel) redistemplate.opsforvalue().get(token);
if (usermodel == null)
// 生成秒殺令牌
string promotoken = promoservice.generatesecondkilltoken(promoid, itemid, usermodel.getid());
if (promotoken == null)
return commonreturntype.create(promotoken);}
下單介面增加對秒殺令牌的校驗邏輯
@responsebody
public commonreturntype createorder(@requestparam(name = "itemid") integer itemid,
@requestparam(name = "amount") integer amount,
@requestparam(name = "promoid", required = false) integer promoid,
@requestparam(name = "promotoken", required = false) string promotoken)
throws busines***ception
usermodel usermodel = (usermodel) redistemplate.opsforvalue().get(token);
if (usermodel == null)
// 校驗秒殺令牌是否正確
if (promoid != null)
if (!stringutils.equals(promotoken, inredispromotoken))
}// 判斷庫存是否已經售罄,若對應的售罄 key 存在,則直接返回下單失敗
if (redistemplate.haskey("promo_item_stock_invalid_" + itemid))
// 在 rocketmq 的事務型訊息中完成下單操作
string stocklogid = itemservice.initstocklog(itemid, amount);
if(!mqproducer.transactionasyncreducestock(usermodel.getid(), promoid, itemid, amount, stocklogid))
return commonreturntype.create(null);}
專案 流量削峰技術
秒殺令牌的原理和使用方法 秒殺大閘的原理和使用方法 佇列洩洪的原理和使用方式 存在缺點 秒殺下單介面會被指令碼不停的刷 秒殺驗證邏輯和秒殺下單介面強關聯,冗餘度高 秒殺驗證邏輯複雜,對交易系統產生無關聯負載 秒殺介面需要依靠令牌才能進入 秒殺的令牌由秒殺活動模組負責生成 秒殺活動模組對秒殺令牌生成全...
秒殺業務場景如何削峰
流量削峰這個概念主要來自於網際網路的業務場景。例如春節火車票搶購,大量的使用者需要同一時間去搶購 又例如阿里的雙十一秒殺,短時間內上億的使用者湧入,瞬間流量巨大 高併發 具體就是,300萬人在凌晨0點搶購一件數量只有500件的商品,最後能購買到的只有300萬人中的這500人。從業務上來說,這種秒殺活...
如何解決秒殺業務的削峰場景
主要是還是來自於網際網路的業務場景,例如,馬上即將開始的春節火車票搶購,大量的使用者需要同一時間去搶購 以及大家熟知的阿里雙11秒殺,短時間上億的使用者湧入,瞬間流量巨大 高併發 比如 200萬人準備在凌晨12 00準備搶購一件商品,但是商品的數量缺是有限的100 500件左右。這樣真實能購買到該件...