秒殺服務(wù)落地方案

一、秒殺的功能概述:

  • 營(yíng)銷后臺(tái)設(shè)置秒殺活動(dòng)并為活動(dòng)添加秒殺商品
  • 開啟活動(dòng)、關(guān)閉活動(dòng)
  • C端獲取秒殺活動(dòng)列表
  • C端查看秒殺商品詳情
  • 提交秒殺訂單
  • 秒殺訂單支付

二末早、秒殺服務(wù)面臨的技術(shù)難題

  1. 限流:
基于是大量用戶搶少量商品的特點(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ì)圖

image.png

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)用戶已購商品記錄'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泻轰,隨后出現(xiàn)的幾起案子技肩,更是在濱河造成了極大的恐慌,老刑警劉巖浮声,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虚婿,死亡現(xiàn)場(chǎng)離奇詭異旋奢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)然痊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門至朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人玷过,你說我怎么就攤上這事爽丹。” “怎么了辛蚊?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵粤蝎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我袋马,道長(zhǎng)初澎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任虑凛,我火速辦了婚禮碑宴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桑谍。我一直安慰自己延柠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布锣披。 她就那樣靜靜地躺著贞间,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雹仿。 梳的紋絲不亂的頭發(fā)上增热,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音胧辽,去河邊找鬼峻仇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛邑商,可吹牛的內(nèi)容都是我干的摄咆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼人断,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼豆同!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起含鳞,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芹务,沒想到半個(gè)月后蝉绷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸭廷,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年熔吗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辆床。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡桅狠,死狀恐怖讼载,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情中跌,我是刑警寧澤咨堤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站漩符,受9級(jí)特大地震影響一喘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗜暴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一凸克、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闷沥,春花似錦萎战、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至颖侄,卻和暖如春鸟雏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背览祖。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工孝鹊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人展蒂。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓又活,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親锰悼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柳骄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容