一、秒殺的功能概述:
- 營(yíng)銷后臺(tái)設(shè)置秒殺活動(dòng)并為活動(dòng)添加秒殺商品
- 開啟活動(dòng)、關(guān)閉活動(dòng)
- C端獲取秒殺活動(dòng)列表
- C端查看秒殺商品詳情
- 提交秒殺訂單
- 秒殺訂單支付
二末早、秒殺服務(wù)面臨的技術(shù)難題
- 限流:
基于是大量用戶搶少量商品的特點(diǎn),必定絕大部分人都搶不到商品,所以需要限制住大部分流量逊彭,只允許少部分流量進(jìn)入。
2.分布式緩存:
秒殺服務(wù)最大的瓶頸還是數(shù)據(jù)庫的讀寫問題构订。數(shù)據(jù)庫屬于磁盤io侮叮,一般來說性能較低,如果能把業(yè)務(wù)數(shù)據(jù)放到緩存中悼瘾,效率會(huì)大大提升囊榜。
3.超賣問題:
高并發(fā)下可能會(huì)出現(xiàn)多減了了庫存的情況。
4.削峰:
高并發(fā)下瞬間的流量峰值通常需要走異步削峰亥宿,使得流量能夠趨于平緩地處理卸勺,通常我們使用消息中間件進(jìn)行異步處理。
三烫扼、解決方案
針對(duì)以上提出的問題我們給出如下解決方案
1.限流:
由于是大量用戶搶少量商品曙求,通常我們會(huì)采用預(yù)扣減庫存來進(jìn)行限制絕大部分流量進(jìn)入。具體怎么做呢材蛛,我們可以將秒殺商品的庫存在秒殺活動(dòng)
開啟時(shí)存入redis中圆到,當(dāng)提交訂單時(shí),我們可以通過預(yù)減redis中的庫存卑吭,扣減成功過芽淡,則可以創(chuàng)建訂單,扣減失敗豆赏,則直接返回庫存不足來限制住
絕大部分流量的進(jìn)入挣菲。
2.分布式緩存
讀:秒殺服務(wù)是屬于典型讀多寫少的場(chǎng)景富稻,所以在讀取秒殺活動(dòng)列表和秒殺商品的時(shí)候,為了應(yīng)對(duì)這種高并發(fā)讀的場(chǎng)景白胀,我們需要將秒殺活動(dòng)的信
息和秒殺商品的信息全部寫入緩存椭赋。
寫:在限流的場(chǎng)景我們也提到,對(duì)于寫的場(chǎng)景或杠,我們需要將商品的秒殺庫存寫入redis哪怔,通過redis來預(yù)扣減庫存
3.超賣問題
高并發(fā)寫商品的超賣問題,是最經(jīng)常見到的問題向抢。一個(gè)訂單中可能有多個(gè)商品认境,而redis本身不支持多個(gè)批量原子性的操作,所以我們需要引入lua
腳本來解決挟鸠。并且為了兜底叉信,可能還需要一把分布式鎖。
4.削峰
即使過濾了絕大部分的無效流量艘希,真正可以下單的流量也是相當(dāng)可觀的硼身,所以我們通常還是需要對(duì)這部分流量進(jìn)行削峰,讓其平緩的進(jìn)入數(shù)據(jù)層
面覆享。我們可以使用消息中間件佳遂,在redis庫存預(yù)扣減成功之后,發(fā)送異步消息撒顿,去扣減數(shù)據(jù)庫的秒殺庫存讶迁。
四、公司已有秒殺服務(wù)設(shè)計(jì)圖
1. 營(yíng)銷后臺(tái)設(shè)置秒殺活動(dòng)并為活動(dòng)添加秒殺商品核蘸。
1)營(yíng)銷后臺(tái)新增秒殺活動(dòng),秒殺活動(dòng)可以按照時(shí)間段啸驯,比如設(shè)置10-1 號(hào)到 10-7 號(hào)是秒殺的日期客扎,每天9:00 - 10:00 和 18:00 -19:00 是秒殺的時(shí)間段(時(shí)間段的設(shè)置對(duì)應(yīng) t_seckill_sale_time 表)。
2)秒殺活動(dòng)中添加商品罚斗,設(shè)置商品的限購數(shù)量(秒殺庫存)徙鱼,單個(gè)用戶的限購數(shù)量,至于這個(gè)秒殺的庫存需不需要受到商品的實(shí)際庫存控制针姿,用戶可以單獨(dú)控制袱吆。
2. 開啟活動(dòng)
開啟活動(dòng)時(shí),會(huì)向redis中設(shè)置兩個(gè)參數(shù)
1)設(shè)置活動(dòng)詳情
type: hash 類型
key:DETAIL:shopAdminId-ruleId
filed_1: DETAILHEADER value: 活動(dòng)詳情
filed_2:DETAILGOODS-時(shí)段id value:商品詳情列表
expire: 活動(dòng)截止時(shí)間-當(dāng)前時(shí)間
2)緩存門店的秒殺活動(dòng)(因?yàn)檎6际窃O(shè)置活動(dòng)的適用門店距淫,但是這里要緩存每個(gè)適用門店所對(duì)應(yīng)的活動(dòng)id)
type: set
key: MARKETING:SECKILL:INDEX:商戶id-門店id
value: ruleId
expire: 活動(dòng)截止時(shí)間-當(dāng)前時(shí)間
3. 商城獲取秒殺活動(dòng)列表
1)根據(jù)門店id從緩存中獲取秒殺活動(dòng)
2)根據(jù)活動(dòng)id從緩存中獲取活動(dòng)詳情和商品詳情绞绒。
3)校驗(yàn)活動(dòng)的時(shí)間過濾出符合的活動(dòng)、設(shè)置商品
4.商城查看秒殺商品詳情
1)調(diào)用營(yíng)銷接口查詢秒殺商品(回包括用戶可購數(shù)量)
2)查詢商品信息(包括商品的庫存)
3)最后商品詳情中的庫存 應(yīng)該是 用戶可購數(shù)量 和 商品的庫存 做比較榕暇,return 用戶可購數(shù)量 > 商品的庫存 ? 商品的庫存 : 用戶可購數(shù)量
5. 提交訂單扣減庫存
以下邏輯加了分布式鎖
1)前置校驗(yàn)活動(dòng)信息
2)判斷當(dāng)前訂單中的商品數(shù)量是否已經(jīng)超過門店可售數(shù)量蓬衡、當(dāng)前用戶購買的商品數(shù)量是否已經(jīng)超過單用戶可購買數(shù)量(緩存中如果沒有喻杈,需要初
始化這兩個(gè)庫存-db和緩存),如果超過狰晚,直接返回筒饰。如果校驗(yàn)通過,則需要向redis中更新以下兩個(gè)緩存壁晒,緩存值分別加上當(dāng)前訂單中商品的數(shù)量瓷们。
1、用戶已購數(shù)量緩存
type: hash
key: MARKETING:SECKILL:USERBUY:shopAdminId-ruleId-mod(userId)
filed: MARKETING:SECKILL:USERBUYDETAIL:userId-時(shí)段id-門店id-商品id
value: 用戶已購數(shù)量
expire: 如果是時(shí)段秒咐,則過期時(shí)間是當(dāng)前時(shí)間到第二天凌晨過期谬晕,因?yàn)槊恳惶斓臅r(shí)段都是新場(chǎng)次;如果是跨天反镇,則是當(dāng)前時(shí)間到固蚤,活動(dòng)結(jié)束時(shí)間說明: 記錄用戶在門店購買商品的數(shù)量,如果活動(dòng)是跨天的歹茶,則時(shí)段id為0夕玩,
因?yàn)槊咳讼拶徥轻槍?duì)所有門店的,所以這里的門店id默認(rèn)為0
2惊豺、門店商品已售數(shù)量緩存
type: hash
key: MARKETING:SECKILL:STOCK:shopAdminId-ruleId-mod(商品id)
filed: MARKETING:SECKILL:STOCKDETAIL:門店id-商品id-時(shí)段id
value: 門店已售數(shù)量
expire: 如果是時(shí)段燎孟,則過期時(shí)間是當(dāng)前時(shí)間到第二天凌晨過期,因?yàn)槊恳惶斓臅r(shí)段都是新場(chǎng)次尸昧;如果是跨天揩页,則是當(dāng)前時(shí)間到,活動(dòng)結(jié)束時(shí)間說明: 記錄用戶在門店購買商品的數(shù)量烹俗,如果活動(dòng)是跨天的爆侣,則時(shí)段id為0,
因?yàn)槊咳讼拶徥轻槍?duì)所有門店的幢妄,所以這里的門店id默認(rèn)為0
注意:秒殺商品的門店可售庫存 需不需要受 商品的實(shí)際庫存 控制 是一個(gè)配置開關(guān)兔仰,如果配置了聯(lián)動(dòng),那么 門店可售庫存 = (限購數(shù) - 已售數(shù)量)> 商品實(shí)際庫存 蕉鸳?商品實(shí)際庫存 : (限購數(shù) - 已售數(shù)量)
如果訂單中的商品數(shù)量 > 門店可售庫存乎赴,則下單失敗。(商品實(shí)際庫存時(shí)調(diào)用商品接口查詢潮尝,有一分鐘的緩存榕吼,因?yàn)橛唵蜗聠螘r(shí)會(huì)調(diào)用商品接口占用庫存,有占用庫存的邏輯兜底勉失,即使失敗,會(huì)重新恢復(fù)秒殺商品商品庫存羹蚣,
所以這里一分鐘的緩存也沒有大問題)
6.訂單取消
回退秒殺商品庫存
總結(jié):結(jié)合我們?cè)谖恼轮械谌糠纸鉀Q方案中提到的,和我們公司現(xiàn)有的設(shè)計(jì)方案做以下比較戴质。
- 在限流方面采用是一致的方案度宦,都是通過redis來預(yù)計(jì)秒殺庫存來限制住了絕大部分流量的進(jìn)入踢匣。
- 其次在緩存方面也是保持一致,緩存了活動(dòng)的信息和秒殺的商品信息戈抄。
在第三部分超賣會(huì)稍有不同离唬,之前我們說redis不支持批量原子性的操作,所以我們最初的解決方案是想通過lua腳本來實(shí)現(xiàn)這一操作划鸽。但是在公司的落地實(shí)現(xiàn)方案上输莺,并不是這么做的。它首先是加了一把分布式鎖裸诽,來保證庫存扣減的并發(fā)安全性嫂用,其次,對(duì)于一個(gè)訂單中的多個(gè)商品丈冬,他是循環(huán)去調(diào)用了 increment 命令嘱函,這樣做會(huì)損失一定的性能損耗,但是同樣也是有好處的埂蕊。因?yàn)閘ua腳本并不保證事務(wù)性往弓,對(duì)于lua腳本中的多個(gè)商品減庫存,如果一個(gè)減失敗了蓄氧,其他商品的庫存操作也會(huì)繼續(xù)執(zhí)行下去函似,這樣就會(huì)導(dǎo)致一定程度上redis和數(shù)據(jù)庫的庫存一致性。相反如果是通過循環(huán)調(diào)用 redis的increment 命令喉童,如果一個(gè)命令失敗了撇寞,那么我們可以手動(dòng)把其他商品的活動(dòng)庫存再給加回去。這樣通過損失一定的性能堂氯,卻在redis和db數(shù)據(jù)一致性上帶來了保證蔑担。
- 最后在削峰方面也保持一致,都是通過mq來進(jìn)行異步去扣減數(shù)據(jù)庫的庫存咽白。
問題一:我們一直說钟沛,能不能創(chuàng)建訂單是通過預(yù)扣減redis的活動(dòng)庫存,其實(shí)通過上面我們公司的實(shí)現(xiàn)方案上來看局扶,也是略有不同的,我們沒有在redis直接存商品的秒殺庫存叁扫,而是緩存了商品的 門店已售數(shù)量 和 用戶秒殺已購數(shù)量三妈,每一個(gè)商品能否秒殺成功,我們是通過比較商品的可售數(shù)量(用戶的可購買數(shù)量) 與 訂單中商品數(shù)量 的大小莫绣。之所以這么做的原因有兩個(gè)畴蒲,一是我們除了要判斷秒殺的商品庫存是否足夠,還需要判斷每個(gè)用戶是否已經(jīng)達(dá)到購買的上限數(shù)对室,那這樣不如保持一致模燥,都直接緩存商品的已售數(shù)量就好咖祭。二是秒殺商品的庫存是不確定的,這個(gè)不確定是說它可以通過開關(guān)來配置是否需要受到商品實(shí)際庫存的控制蔫骂。一旦用戶改變開關(guān)么翰,商品的實(shí)際可售的秒殺庫存就會(huì)發(fā)生變化,那這樣辽旋,我們緩存已售數(shù)量就是更合理的
浩嫌。
問題二、秒殺商品的庫存和商品實(shí)際可售庫存的關(guān)系 :秒殺商品的門店可售庫存 需不需要受 商品的實(shí)際庫存 控制 是一個(gè)配置開關(guān)补胚,如果配置了聯(lián)動(dòng)码耐,那么 門店可售庫存 = 限購數(shù) - 已售數(shù)量 > 商品實(shí)際庫存 ?商品實(shí)際庫存 : 限購數(shù) - 已售數(shù)量 溶其。如果訂單中的商品數(shù)量 > 門店可售庫存骚腥,則下單失敗。(商品實(shí)際庫存是調(diào)用商品接口查詢瓶逃,有一分鐘的緩存束铭,因?yàn)橛唵蜗聠螘r(shí)會(huì)調(diào)用商品接口占用庫存,有占用庫存的邏輯兜底金闽,即使失敗,會(huì)重新恢復(fù)秒殺商品商品庫存纯露,所以這里一分鐘的緩存也沒有大問題)
問題三:如何保證redis中 不會(huì)超賣也就是庫存數(shù)不會(huì)小于 0 呢?其實(shí)也就是如果保證 門店已售數(shù)量 + 購買數(shù) < 門店商品限購數(shù) 這個(gè)邏輯要想保證原子性代芜,需要使用lua腳本來實(shí)現(xiàn)埠褪。腳本代碼如下:
local cc=tonumber(購買數(shù))
if tonumber(商品限購數(shù))>=redis.call('HINCRBY',商品key挤庇,門店商品已售數(shù)量],0)+cc
then return redis.call('HINCRBY',key, filed , cc)
end return 0`
(其中tonumber是redis內(nèi)置函數(shù)钞速,用來將目標(biāo)數(shù)轉(zhuǎn)換成數(shù)值)
五、秒殺服務(wù)數(shù)據(jù)庫設(shè)計(jì)
CREATE TABLE t_shop_seckill_rule
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
shop_admin_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商戶管理員ID',
start_time
timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '有效期-開始時(shí)間',
end_time
timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '有效期-結(jié)束時(shí)間',
name
varchar(50) NOT NULL DEFAULT '' COMMENT '活動(dòng)名稱',
active_status
tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '狀態(tài):開啟(1)嫡秕,停止(0)',
status
tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態(tài):正常(1)渴语,刪除(-1)',
is_pre_sale
tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否預(yù)售1.是 0.否 默認(rèn)0',
pre_days
int(10) NOT NULL DEFAULT '0' COMMENT '預(yù)售天數(shù)',
pre_hours
varchar(255) NOT NULL DEFAULT '' COMMENT '預(yù)售小時(shí),與pre_days聯(lián)合使用',
creator_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '創(chuàng)建人',
create_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
update_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '修改人',
update_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時(shí)間',
time_mode
int(10) NOT NULL DEFAULT '0' COMMENT '秒殺模式 0:時(shí)段秒殺;1:跨天秒殺 默認(rèn)0',
ext
varchar(255) NOT NULL DEFAULT '' COMMENT '擴(kuò)展字段 json',
active_code
varchar(32) NOT NULL DEFAULT '' COMMENT '活動(dòng)編碼',
shop_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '品牌id',
PRIMARY KEY (id
) USING BTREE,
KEY idx_ac_st_ad
(shop_admin_id
,active_status
,status
),
KEY idx_sid_st_et
(shop_admin_id
,start_time
,end_time
)
) ENGINE=InnoDB AUTO_INCREMENT=511 DEFAULT CHARSET=utf8 COMMENT='秒殺活動(dòng)信息表'
CREATE TABLE t_seckill_sale_time
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
seckill_id
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '秒殺規(guī)則ID',
start_time
char(8) NOT NULL DEFAULT '' COMMENT '開始時(shí)間',
end_time
char(8) NOT NULL DEFAULT '' COMMENT '結(jié)束時(shí)間',
status
tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態(tài):開啟(1),刪除(-1),停用(0)',
orders
tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '排列順序',
create_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
update_time
timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY (id
),
KEY idx_skId
(seckill_id
,start_time
,end_time
)
) ENGINE=InnoDB AUTO_INCREMENT=1081 DEFAULT CHARSET=utf8 COMMENT='秒殺時(shí)間區(qū)間表'
CREATE TABLE t_shop_seckill_goods_x
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
shop_admin_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商戶管理員ID',
seckill_id
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '秒殺活動(dòng)id',
sale_time_id
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '銷售時(shí)間區(qū)間id',
goods_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '商品id',
product_image_url
varchar(255) NOT NULL DEFAULT '' COMMENT '商品圖片',
goods_image_url
varchar(255) DEFAULT '' COMMENT '秒殺活動(dòng)商品圖片',
product_code
varchar(255) NOT NULL DEFAULT '' COMMENT '商品code',
product_name
varchar(255) NOT NULL DEFAULT '' COMMENT '商品名稱',
product_desc
varchar(255) NOT NULL COMMENT '商品描述',
product_upc
varchar(255) NOT NULL DEFAULT '' COMMENT '商品upc',
category_name
varchar(50) DEFAULT '' COMMENT '商品分類',
sku_upc
varchar(50) NOT NULL DEFAULT '' COMMENT '規(guī)格upc',
sku_price
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '規(guī)格銷售價(jià)',
sku_id
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '規(guī)格ID',
sku_name
varchar(255) NOT NULL DEFAULT '' COMMENT '規(guī)格名稱',
active_status
tinyint(4) NOT NULL DEFAULT '1' COMMENT '活動(dòng)狀態(tài):開啟上架,關(guān)閉[下架](0)',
status
tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態(tài):開啟(1)昆咽,刪除(-1)驾凶,停用(0)',
skill_price
bigint(20) unsigned NOT NULL DEFAULT '1' COMMENT '秒殺價(jià)',
goods_number
int(10) NOT NULL DEFAULT '-1' COMMENT '秒殺限購數(shù)量,-1為不限購',
less_number
int(10) NOT NULL DEFAULT '-1' COMMENT '每人限購數(shù)量,-1為不限購',
creator_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '創(chuàng)建人',
create_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
update_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '修改人',
update_time
timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改時(shí)間',
shop_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '品牌id',
serial_number
int(10) NOT NULL DEFAULT '0' COMMENT '排序序號(hào)',
virtual_sale_number
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '虛擬銷量',
PRIMARY KEY (id
) USING BTREE,
KEY idx_sti_upc_as_st
(sale_time_id
,sku_upc
,active_status
,status
),
KEY idx_skId_gId
(seckill_id
,goods_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='秒殺商品信息表'
CREATE TABLE t_seckill_store_stock_x
(
id
int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
bus_id
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '秒殺時(shí)段id',
bus_type
tinyint(4) unsigned NOT NULL COMMENT '類型:秒殺(13)',
store_id
bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '門店ID',
sku_upc
varchar(50) NOT NULL DEFAULT '' COMMENT '規(guī)格UPC',
real_number
int(10) NOT NULL DEFAULT '0' COMMENT '剩余庫存掷酗,-1為不限購',
status
tinyint(4) NOT NULL DEFAULT '1' COMMENT '狀態(tài):開啟(1),刪除(-1),停用(0)调违,此字段作廢',
creator_id
bigint(20) unsigned DEFAULT '0' COMMENT '創(chuàng)建人',
update_id
bigint(20) unsigned DEFAULT '0' COMMENT '更新',
create_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
update_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
bought_stock
int(10) NOT NULL DEFAULT '0' COMMENT '已售數(shù)量',
shop_admin_id
bigint(20) NOT NULL COMMENT '商戶id',
PRIMARY KEY (id
),
KEY idx_SBS
(store_id
,bus_id
,sku_upc
),
KEY idx_bId_sku
(bus_id
,sku_upc
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='門店秒殺商品庫存表'
CREATE TABLE t_seckill_user_quantity_x
(
id
bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
shop_admin_id
bigint(20) NOT NULL COMMENT '商戶id',
sec_kill_id
bigint(20) NOT NULL COMMENT '秒殺活動(dòng)id',
sale_time_id
int(10) unsigned NOT NULL DEFAULT '0' COMMENT '銷售時(shí)間區(qū)間id',
user_id
bigint(20) NOT NULL COMMENT '用戶id',
store_id
bigint(20) NOT NULL COMMENT '門店id',
sku_upc
varchar(32) NOT NULL COMMENT '規(guī)格UPC',
quantity
int(11) NOT NULL DEFAULT '0' COMMENT '購買數(shù)量',
create_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',
update_time
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',
PRIMARY KEY (id
),
KEY idx_USSS
(sec_kill_id
,sale_time_id
,store_id
,user_id
,sku_upc
)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8 COMMENT='秒殺活動(dòng)用戶已購商品記錄'