<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
電商系統的促銷手段(Electronic Commerce Systems):
優惠券的種類:
優惠券系統的核心流程:
發券
發券的方式: 同步傳送 or 非同步傳送
領券
用券
需求拆解
商家側:
使用者側:
券的分散式事務,使用券的過程會出現的分散式問題分析
如何防止超發
如何大批次給使用者發券
如何限制券的使用條件
如何防止使用者重複領券
模型的設計
優惠券系統 Coupon System 模型定義
優惠券系統的難點
指一批優惠券的抽象、模板,包含優惠券的大部分屬性。
如商家建立了一批優惠券,共1000張,使用時間為2022-11-11 00:00:00 ~ 2022-11-11 23:59:59,規定只有數碼類目商品才能使用,滿100減50。
發放到使用者的一個實體,已與使用者繫結。
如將某批次的優惠券中的一張傳送給某個使用者,此時優惠券屬於使用者。
優惠券的使用有規則和條件限制,比如滿100減50券,需要達到門檻金額100元才能使用。
券批次表 coupon_batch
規則表 rule:
規則內容:
{ threshold: 5.01 // 使用門檻 amount: 5 // 優惠金額 use_range: 3 // 使用範圍,0—全場,1—商家,2—類別,3—商品 commodity_id: 10 // 商品 id receive_count: 1 // 每個使用者可以領取的數量 is_mutex: true // 是否互斥,true 表示互斥,false 表示不互斥 receive_started_at: 2020-11-1 00:08:00 // 領取開始時間 receive_ended_at: 2020-11-6 00:08:00 // 領取結束時間 use_started_at: 2020-11-1 00:00:00 // 使用開始時間 use_ended_at: 2020-11-11 11:59:59 // 使用結束時間 }
優惠券表 coupon:
create table t_coupon ( coupon_id int null comment '券ID,主鍵', user_id int null comment '使用者ID', batch_id int null comment '批次ID', status int null comment '0-未使用、1-已使用、2-已過期、3-凍結', order_id varchar(255) null comment '對應訂單ID', received_time datetime null comment '領取時間', validat_time datetime null comment '有效日期', used_time datetime null comment '使用時間' );
建券:
1、新建規則
INSERT INTO rule (name, type, rule_content) VALUES(「滿減規則」, 0, '{ threshold: 100 amount: 10 ...... }');
2、新建優惠券批次
INSERT INTO coupon_batch (coupon_name, rule_id, total_count ) VALUES(「勞斯萊斯5元代金券」, 1010, 10000);
發券:
如何給大量使用者發券?
非同步傳送
資訊表 message
create table t_message ( id int null comment '資訊ID', send_id int null comment '傳送者id', rec_id int null comment '接受者id', content vachar(255) comment '站內信內容', is_read int null comment '是否已讀', send_time datetime comment '傳送時間' ) comment '資訊表';
先考慮使用者量很少的情況,商家要給所有人發站內信,則先遍歷使用者表,再按照使用者表中的所有使用者依次將站內信插入到 message 表中。這樣,如果有100個使用者,則群發一條站內信要執行100個插入操作。
發一條站內信,就得重複插入上萬條資料。而且這上萬條資料的 content 一樣!假設一條站內信佔100K,發一次站內信就要消耗十幾M。對此,可將原來的表拆成兩個表:
資訊表 message
資訊內容表 message_content
這就有【非活躍使用者】的問題,假設註冊使用者一千萬,根據二八原則,其中活躍使用者佔20%。若採用上面拆成兩個表的情況,發一封“站內信”,得執行一千萬個插入操作。可能剩下80%使用者基本都不會再登入,其實只需對其中20%使用者插入資料。
資訊表 message:
create table t_message ( id int null comment '資訊 ID', # send_id int null comment '傳送者 id', 去除該欄位 rec_id int null comment '接受者 id', message_id int null comment '外來鍵,資訊內容', is_read int null comment '是否已讀' ) comment '資訊表';
create table t_message_content ( id int null comment '資訊內容id', send_id int null comment '傳送者id', content varchar(255) null comment '內容', send_time datetime null comment '傳送時間' );
登入後,首先查詢 message_content 中的那些沒有在 message 中有記錄的資料,表示是未讀的站內信。在查閱站內信的內容時,再將相關的記錄插入 message。
發站內信時:
假設商家要給 10W 使用者發券:
有什麼問題?重複消費,導致超發!
# 記住使用事務哦! INSERT INTO coupon (user_id, coupon_id,batch_id) VALUES(1001, 66889, 1111); UPDATE coupon_batch SET total_count = total_count - 1, assign_count = assign_count + 1 WHERE batch_id = 1111 AND total_count > 0;
步驟:
SELECT total_count FROM coupon_batch WHERE batch_id = 1111;
# 注意事務! INSERT INTO coupon (user_id, coupon_id,batch_id) VALUES(1001, 66889, 1111); UPDATE coupon_batch SET total_count = total_count - 1, assign_count = assign_count + 1 WHERE batch_id = 1111 AND total_count > 0;
使用者領券過程中,其實也會出現類似秒殺場景。秒殺場景下會有哪些問題,如何解決?
解決使用者重複領取或多領:
Redis 資料校驗!
# 判斷成員元素是否是集合的成員 SISMEMBER KEY VALUE SISMEMBER batch_id:1111:user_id 1001
# 將一或多個成員元素加入到集合中,已經存在於集合的成員元素將被忽略 SADD KEY VALUE1......VALUEN SADD batch_id:1111:user_id 1001
何時校驗優惠券使用規則?
確認訂單頁,對優惠券進行校驗:
SELECT batch_id FROM coupon WHERE user_id = 1001 AND status = 0; SELECT rule_id FROM coupon_batch WHERE batch_id = 1111; SELECT name, type, rule_content FROM rule WHERE rule_id = 1010; 複製程式碼
同時操作多個服務,如何保證一致性?
優惠券操作記錄表 Coupon_opt_record
create table t_coupon_opt_record ( user_id int null comment '使用者id', coupon_id int null comment '優惠券id', operating int null comment '操作,0-鎖定、1-核銷、2-解鎖', operated_at datetime null comment '操作時間' );
TCC,Try-Confirm-Cancel,目前分散式事務主流解決方案。
階段一:Try
對資源進行凍結,預留業務資源
建立訂單時,將優惠券狀態改為 “凍結”
階段二:Confirm
確認執行業務操作,做真正提交,將第一步Try中凍結的資源,真正扣減
訂單支付成功,將優惠券狀態改為 “已使用”
階段三:Cancel
取消執行業務操作,取消Try階段預留的業務資源
支付失敗/超時或訂單關閉情況,將優惠券狀態改為 “未使用”
快過期券提醒:
定時掃券表:
缺點:掃描資料量太大,隨著歷史資料越來越多,會影響線上主業務,最終導致慢SQL。
延時訊息:
缺點:有些券的有效時間太長了(30天)以上,有可能造成大量 MQ 積壓
新增通知表:
優點:掃描的資料量小,效率高。刪除無用的已通知的資料記錄
create table t_notify_msg ( id bigint auto_increment comment '自增主鍵', coupon_id bigint null comment '券id', user_id bigint null comment '使用者id', notify_day varchar(255) null comment '需要執行通知的日期', notify_type int null comment '通知型別,1-過期提醒', notif_time timestamp null comment '通知的時間,在該時間戳所在天內通知', status int null comment '通知狀態,0-初始狀態、1-成功、2-失敗', constraint t_notify_msg_id_uindex unique (id) ); alter table t_notify_msg add primary key (id);
過期券提醒:
前端限流:
點選一次後,按鈕短時間內建灰
後端限流:
部分請求直接跳轉到【繁忙頁】
到此這篇關於Java+MySQL實現設計優惠券系統的文章就介紹到這了,更多相關Java+MySQ設計系統內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45