你好,本文将探讨在电商平台虾皮上设计和实施优惠券系统的有效方法,分享真实的面试问题和解决方案,帮助你更好地理解电商系统设计的核心要素。

电商系统的促销方式

电商平台通常采用多种促销手段来吸引消费者,其中包括:

  • 优惠券
  • 拼团
  • 砍价
  • 老带新

各类优惠券介绍

优惠券的类型主要可以分为:

  • 满减券
  • 直减券
  • 折扣券

优惠券系统的核心流程

优惠券发放

**发券方式:**可选择同步发送或异步发送方式。

优惠券领取

  • **领取对象:**所有用户或特定用户。
  • **领取上限:**每种优惠券最多允许领取的数量。
  • **领取方式:**用户主动领取或自动发放。

优惠券使用

  • **作用范围:**适用于商品、商户或具体类目。
  • **计算方式:**需考虑互斥性和门槛条件。

需求拆解

对于商家端而言,主要需求包括:

  • 创建优惠券
  • 发送优惠券

而对于用户端,需求则涉及:

  • 领取优惠券
  • 下单
  • 使用优惠券
  • 支付

服务结构设计

服务结构示意图

图片

优惠券系统的难点分析

  1. 分布式事务问题:使用优惠券时可能面临的各种分布式问题。
  2. 如何避免超发优惠券。
  3. 如何高效地向大量用户发送优惠券。
  4. 如何限制优惠券的使用条件和防止用户重复领取。

存储设计

优惠券系统模型定义

优惠券系统的基本模型包括:

券批次(券模板)

用于描述一批优惠券的基本属性,如总数量、适用时间和使用条件。

券实体

每张发放给用户的优惠券,与用户绑定。

使用规则

优惠券使用时的规则和条件限制,例如满减条件。

表单设计

券批次表 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);  

如何向大量用户发放优惠券?

使用异步发送方式,确保高效和准确。

用户操作及系统优化

领券过程中需注意的步骤

  1. 校验优惠券余量。
  2. 更新用户的优惠券记录。
  3. 采用 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)  
);  

总结

设计和实施一个高效的优惠券系统是电商平台成功的关键。本文章详细探讨了优惠券的类型、核心流程和系统设计的需求,提供了有效的解决方案,希望能为你的电商系统设计提供启发。