优惠券有总库存、每日库存,用户领取也有总领取次数、每日领取次数。怎么设计存储方式和加锁呢?
你好,如分析的不合理请见谅。
首先,可以将你的描述分为几大类:优惠券、总库存、每日库存以及用户领取方式
一、优惠券
1、确定优惠券是否存在多种分类(如没有建议考虑这方面设计),如满100减1块
2、优惠券的使用需要考虑,如关联活动、商品(部分商品)等
3、建议表设计
(1)、优惠券(建议加一个详情表):主键、类型(建议加一个类型的字典表【码表】)、开始时间、结束时间、总库存、每日库存、状态(上下架)、时间戳(可用于乐观锁)、上架时间、下架时间、创建时间、创建人、更新时间、更新人
二、总库存/每日库存
背景:总库存应考虑一个前提,如后管操作增减或删除库存,也要建立详情表,避免数据变更无法追溯。
最后实现方式:
1、可考虑使用Redis分布式锁,优惠券和用户应该主要考虑每日库存/领取次数,每次领取扣减一,可使用Incrby
key设置:
(1)、优惠券:优惠券主键_日期(日期格式如:20210218),保证当天优惠券只有一个库存,可在每日定时任务中设置,建议第一次初始化的时候,分别设置一个优惠券今天和明天的redis缓存
(2)、领取方式:用户唯一标识_优惠券主键_日期,其他参照优惠券
2、用户每日领取方式:
(1)、设计的时候,保证每个用户的原子性,建议在领取中加入分布式锁,避免超过每日领取;
(2)、如在接口端已加入分布式锁,在领取的时候,可采用数据库和redis的方式判断用户的领取次数