Redis如何实现高并发场景下领券中心的领券功能?

优惠券有总库存、每日库存,用户领取也有总领取次数、每日领取次数。怎么设计存储方式和加锁呢?

你好,如分析的不合理请见谅。

首先,可以将你的描述分为几大类:优惠券、总库存、每日库存以及用户领取方式

一、优惠券

1、确定优惠券是否存在多种分类(如没有建议考虑这方面设计),如满100减1块

2、优惠券的使用需要考虑,如关联活动、商品(部分商品)等

3、建议表设计

(1)、优惠券(建议加一个详情表):主键、类型(建议加一个类型的字典表【码表】)、开始时间、结束时间、总库存、每日库存、状态(上下架)、时间戳(可用于乐观锁)、上架时间、下架时间、创建时间、创建人、更新时间、更新人

 

 

二、总库存/每日库存

背景:总库存应考虑一个前提,如后管操作增减或删除库存,也要建立详情表,避免数据变更无法追溯。

 

最后实现方式:

1、可考虑使用Redis分布式锁,优惠券和用户应该主要考虑每日库存/领取次数,每次领取扣减一,可使用Incrby

key设置:

(1)、优惠券:优惠券主键_日期(日期格式如:20210218),保证当天优惠券只有一个库存,可在每日定时任务中设置,建议第一次初始化的时候,分别设置一个优惠券今天和明天的redis缓存

(2)、领取方式:用户唯一标识_优惠券主键_日期,其他参照优惠券

 

2、用户每日领取方式:

(1)、设计的时候,保证每个用户的原子性,建议在领取中加入分布式锁,避免超过每日领取;

(2)、如在接口端已加入分布式锁,在领取的时候,可采用数据库和redis的方式判断用户的领取次数

  • 数据库实现方式:用户每次领取成功后,在用户领取详情表中插入一条数据,每次领取count下用户的领取次数,判断是否小于当前设置的领取次数
  • Redis实现方式:首次判断是否存在领取,如未领取可初始化他的缓存值