秒殺業務的核心是庫存處理,使用者購買成功後會進行減庫存操作,並記錄購買明細。當秒殺開始時,大量使用者同時發起請求,這是乙個並行操作,多條更新庫存數量的sql語句會同時競爭秒殺商品所處資料庫表裡的那行資料,導致庫存的減少數量與購買明細的增加數量不一致,因此,我們使用rabbitmq進行削峰限流並且將請求資料序列處理。
首先我先設計了兩張表,一張是秒殺庫存表,另一張是秒殺成功表。
create table seckill (
seckill_id bigint not null auto_increment comment '商品庫存id',
name varchar(120) not null comment '商品名稱',
number int not null comment '庫存數量',
initial_price bigint not null comment '原價',
seckill_price bigint not null comment '秒殺價',
sell_point varchar(500) not null comment '賣點',
create_time timestamp not null default current_timestamp comment '秒殺建立時間',
start_time timestamp not null comment '秒殺開始時間',
end_time timestamp not null comment '秒殺結束時間',
primary key (seckill_id)
);alter table seckill comment '秒殺庫存表';
create index idx_create_time on seckill
( create_time
);create index idx_start_time on seckill
(start_time
);create index idx_end_time on seckill
( end_time);
create table success_killed
( success_id bigint not null auto_increment comment '秒殺成功id',
seckill_id bigint not null comment '秒殺商品id',
user_phone bigint not null comment '使用者手機號',
state tinyint not null default -1 comment '狀態標誌:-1:無效;0:成功',
create_time timestamp not null comment '秒殺成功建立時間',
primary key (success_id)
);alter table success_killed comment '秒殺成功表';
create index idx_create_time on success_killed
( create_time
);接下來我開始模擬使用者請求,往rabbitmq中傳送100個手機號。
public string goods(@pathvariable("seckillid")long seckillid)
return "success"; }
public void setgoods(long seckillid,stringuserphone)
然後我用rabbitmq監聽seckill_queue佇列,當佇列中接收到訊息就會自動觸發rabbitmqservice類中的executeseckill方法,訊息將作為方法的引數傳遞進來執行秒殺操作。
public class rabbitmqservice else catch (runtimeexception e) {
//spring事務回滾只對執行期異常起作用
throw new runtimeexception("seckill error:" + e.getmessage());
最後我在前端頁面使用倒計時外掛程式增強使用者體驗效果。
秒殺場景下MySQL的低效
最近業務試水電商,接了乙個秒殺的活。之前經常看到 的同行們討論秒殺,討論電商,這次終於輪到我們自己理論結合實際一次了。ps 進入正文前先說一點個人感受,之前看 的ppt感覺都懂了,等到自己出解決方案的時候發現還是有很多想不到的地方其實都沒懂,再次驗證了 細節是魔鬼 的理論。並且乙個人的能力有限,只有...
對秒殺場景的學習(3)
當併發量很大時,秒殺的商品的庫存已經為零,這個時候如果再去redis裡面查庫存,這樣就會影響效率 1.可以在 的邏輯上面加乙個concurrenthashmap的值,這樣就可以對其裡面的值做乙個判斷。2.如果是集群部署,當乙個伺服器發現庫存為零,往這個concurrenthashmap裡面存 乙個庫...
akka設計模式系列 akka在秒殺場景的應用
本部落格討論一下akka在秒殺場景下的應用,提出自己的見解,只做拋磚引玉,大神勿噴。秒殺活動涉及到前中後台各個階段,為了說明問題,我們簡化場景,只研究akka在後台如何處理秒殺業務。秒殺活動 所謂的秒殺活動,簡單點來說,就是把某個稀缺商品或 商品,掛到頁面,供大量客戶搶購。這裡有兩個關鍵點,商品數量...