业务描述

红包分为三个奖项 数量分别是一等奖100、二等奖200、三等奖25000。中奖率分别为千分之10、千分之200。抢红包必须中奖所以三等奖概率无意义。红包时间为一天预计抢红包人数为10万。


指导思想

  1. 拦截无效流量,无效流量主要是,抢过红包的用户,一直重试用户。通过限流把这些用户拦截在抢红包业务场景之外。
  2. 预热数据,由于红包用户是达成一定条件才能抢红包,所以提前把满足条件用户缓存到本地。(防止大量验证用户身身份口调用)
  3. 安全方面,防止出现刷红包操作。拿到特定参数大量重复调用后台接口。

项目技术栈

maven、spring、hibernate、jersy、redis、mysql


设计思路

action设计
  1. 判断当前活动是否开启
  2. 判断当前用户是否抢过红包(redsi判断)
  3. 拦截重复点击操作,防止刷接口。采用redis.setNx操作设置过期时间30秒钟。
  4. 拦截每秒钟请求数量,使用guava ratelimit 限制请求数量。
service设计
  1. 判断用户是否领过红包(redis判断),为了防止出现redis缓存不可用情况(数据库判断)
  2. 查询本地预热数据,判断用户条件
  3. 调用上游系统验证用户条件

中奖概率设计

中奖概率采用系统生成随机数判断。例如二等奖中奖概率为30%。则在redis中缓存set(“redwar:SLChance”,300);。判断产生的随机数小于300时中二等奖。

另外开放中奖概率可修改接口,随时调整中奖概率。防止出现二等奖未领完二三等奖领完情况发生。

初始化红包数据

  1. 读取数据库活动红包总库存 redis.set(“redWar:201711010009”,25000);
  2. 分别初始化三个等级奖项红包id入队列,redis.lpush(“redWar:201711010009:FLIds”,id)
  3. 初始化中奖概率 redis.set(“redWar:SLChance”,300)
  4. 初始化已经中奖人员信息redis.set(“redWar:user:id”)