日淘平台为了吸引用户通常会提供多种优惠券功能新人券、运费券、满减券、节日券等。北极星日淘的优惠券系统每天处理数万次领券和核销请求必须保证高并发下的准确性和一致性。本文将分享其技术架构。一、优惠券的数据模型CREATETABLEcoupon(idbigintPRIMARYKEYAUTO_INCREMENT,namevarchar(100)NOTNULL,typetinyintCOMMENT1:满减 2:折扣 3:运费减免,thresholdintCOMMENT使用门槛(分),reduce_amountintCOMMENT减免金额(分),total_quantityintCOMMENT总发行量,remain_quantityintCOMMENT剩余数量,per_user_limitintDEFAULT1COMMENT每人限领,start_timedatetime,end_timedatetime);二、高并发领券Redis 预扣库存直接操作 MySQL 会导致行锁竞争。北极星日淘使用 Redis Lua 脚本实现原子性扣减。-- 领券 Lua 脚本localkeyKEYS[1]-- 优惠券库存 keylocaluser_keyKEYS[2]-- 用户已领 keylocaluser_idARGV[1]locallimittonumber(ARGV[2])localuser_countredis.call(scard,user_key)ifuser_countlimitthenreturn-1-- 超过限领数量endlocalremainredis.call(get,key)ifnotremainortonumber(remain)0thenreturn-2-- 库存不足endredis.call(decr,key)redis.call(sadd,user_key,user_id)return1三、规则引擎动态匹配最优券用户下单时系统需要从多张可用券中自动选择最优惠的一张。北极星日淘引入了 Drools 规则引擎。ruleAuto choose best couponwhen $order:Order(totalAmount0)$couponList:ArrayList(size0)from couponService.getAvailableCoupons($order)thenCouponbestnull;for(Couponc:$couponList){if(bestnull||c.calcDiscount($order)best.calcDiscount($order)){bestc;}}$order.setSelectedCoupon(best);end四、防超领和作弊为了防止用户恶意刷券系统还做了以下限制同一用户 ID、同一设备指纹、同一 IP 在短时间内多次领券会被限流。使用 Sentinel 熔断降级当领券 QPS 超过阈值时自动返回兜底逻辑。spring:cloud:sentinel:flow:-resource:receiveCouponcount:100grade:1# QPS 限流五、总结北极星日淘的优惠券系统采用 Redis 预扣库存 Lua 原子操作 Drools 规则引擎 Sentinel 限流在高并发场景下稳定运行。这套设计可以复用到大多数电商平台的营销系统中。对于后端开发者尤其是电商系统开发者这是一个非常经典的设计案例。#优惠券功能 #规则引擎 #高并发 #北极星日淘
日淘平台优惠券系统的设计:从规则引擎到防超领
发布时间:2026/6/10 3:00:30
日淘平台为了吸引用户通常会提供多种优惠券功能新人券、运费券、满减券、节日券等。北极星日淘的优惠券系统每天处理数万次领券和核销请求必须保证高并发下的准确性和一致性。本文将分享其技术架构。一、优惠券的数据模型CREATETABLEcoupon(idbigintPRIMARYKEYAUTO_INCREMENT,namevarchar(100)NOTNULL,typetinyintCOMMENT1:满减 2:折扣 3:运费减免,thresholdintCOMMENT使用门槛(分),reduce_amountintCOMMENT减免金额(分),total_quantityintCOMMENT总发行量,remain_quantityintCOMMENT剩余数量,per_user_limitintDEFAULT1COMMENT每人限领,start_timedatetime,end_timedatetime);二、高并发领券Redis 预扣库存直接操作 MySQL 会导致行锁竞争。北极星日淘使用 Redis Lua 脚本实现原子性扣减。-- 领券 Lua 脚本localkeyKEYS[1]-- 优惠券库存 keylocaluser_keyKEYS[2]-- 用户已领 keylocaluser_idARGV[1]locallimittonumber(ARGV[2])localuser_countredis.call(scard,user_key)ifuser_countlimitthenreturn-1-- 超过限领数量endlocalremainredis.call(get,key)ifnotremainortonumber(remain)0thenreturn-2-- 库存不足endredis.call(decr,key)redis.call(sadd,user_key,user_id)return1三、规则引擎动态匹配最优券用户下单时系统需要从多张可用券中自动选择最优惠的一张。北极星日淘引入了 Drools 规则引擎。ruleAuto choose best couponwhen $order:Order(totalAmount0)$couponList:ArrayList(size0)from couponService.getAvailableCoupons($order)thenCouponbestnull;for(Couponc:$couponList){if(bestnull||c.calcDiscount($order)best.calcDiscount($order)){bestc;}}$order.setSelectedCoupon(best);end四、防超领和作弊为了防止用户恶意刷券系统还做了以下限制同一用户 ID、同一设备指纹、同一 IP 在短时间内多次领券会被限流。使用 Sentinel 熔断降级当领券 QPS 超过阈值时自动返回兜底逻辑。spring:cloud:sentinel:flow:-resource:receiveCouponcount:100grade:1# QPS 限流五、总结北极星日淘的优惠券系统采用 Redis 预扣库存 Lua 原子操作 Drools 规则引擎 Sentinel 限流在高并发场景下稳定运行。这套设计可以复用到大多数电商平台的营销系统中。对于后端开发者尤其是电商系统开发者这是一个非常经典的设计案例。#优惠券功能 #规则引擎 #高并发 #北极星日淘