如何高效设计和实施电商平台虾皮的优惠券系统:从需求到解决方案的全面分析
你好,本文将探讨在电商平台虾皮上设计和实施优惠券系统的有效方法,分享真实的面试问题和解决方案,帮助你更好地理解电商系统设计的核心要素。
电商系统的促销方式
电商平台通常采用多种促销手段来吸引消费者,其中包括:
- 优惠券
- 拼团
- 砍价
- 老带新
各类优惠券介绍
优惠券的类型主要可以分为:
- 满减券
- 直减券
- 折扣券
优惠券系统的核心流程
优惠券发放
**发券方式:**可选择同步发送或异步发送方式。
优惠券领取
- **领取对象:**所有用户或特定用户。
- **领取上限:**每种优惠券最多允许领取的数量。
- **领取方式:**用户主动领取或自动发放。
优惠券使用
- **作用范围:**适用于商品、商户或具体类目。
- **计算方式:**需考虑互斥性和门槛条件。
需求拆解
对于商家端而言,主要需求包括:
- 创建优惠券
- 发送优惠券
而对于用户端,需求则涉及:
- 领取优惠券
- 下单
- 使用优惠券
- 支付
服务结构设计
服务结构示意图
优惠券系统的难点分析
- 分布式事务问题:使用优惠券时可能面临的各种分布式问题。
- 如何避免超发优惠券。
- 如何高效地向大量用户发送优惠券。
- 如何限制优惠券的使用条件和防止用户重复领取。
存储设计
优惠券系统模型定义
优惠券系统的基本模型包括:
券批次(券模板)
用于描述一批优惠券的基本属性,如总数量、适用时间和使用条件。
券实体
每张发放给用户的优惠券,与用户绑定。
使用规则
优惠券使用时的规则和条件限制,例如满减条件。
表单设计
券批次表 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, // 是否互斥
"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 '使用时间'
);
优惠券的创建与发放
新建规则示例
INSERT INTO rule (name, type, rule_content)
VALUES("满减规则", 0, '{
"threshold": 100,
"amount": 10
}');
新建优惠券批次
INSERT INTO coupon_batch (coupon_name, rule_id, total_count)
VALUES("劳斯莱斯5元代金券", 1010, 10000);
如何向大量用户发放优惠券?
使用异步发送方式,确保高效和准确。
用户操作及系统优化
领券过程中需注意的步骤
- 校验优惠券余量。
- 更新用户的优惠券记录。
- 采用 Redis 数据进行校验,确保用户不重复领取。
使用优惠券的规则校验
在用户确认订单时,系统需进行如下校验:
- 确认优惠券是否过期
- 确认使用范围
- 确认是否达到门槛
- 确认优惠券是否互斥
选择可用券并返回结果
确保数据一致性的方案
设计优惠券操作记录表以确保每一操作都是可追溯的,采用 TCC(Try-Confirm-Cancel)模式确保事务的安全执行。
缩短过期券的提醒时间
采用新增通知表的方式来存储用户的过期券提醒信息,确保高效高效地进行通知。
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)
);
总结
设计和实施一个高效的优惠券系统是电商平台成功的关键。本文章详细探讨了优惠券的类型、核心流程和系统设计的需求,提供了有效的解决方案,希望能为你的电商系统设计提供启发。
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果