抢红包
业务描述
红包分为三个奖项 数量分别是一等奖100、二等奖200、三等奖25000。中奖率分别为千分之10、千分之200。抢红包必须中奖所以三等奖概率无意义。红包时间为一天预计抢红包人数为10万。
指导思想
- 拦截无效流量,无效流量主要是,抢过红包的用户,一直重试用户。通过限流把这些用户拦截在抢红包业务场景之外。
- 预热数据,由于红包用户是达成一定条件才能抢红包,所以提前把满足条件用户缓存到本地。(防止大量验证用户身身份口调用)
- 安全方面,防止出现刷红包操作。拿到特定参数大量重复调用后台接口。
项目技术栈
maven、spring、hibernate、jersy、redis、mysql
设计思路
action设计
- 判断当前活动是否开启
- 判断当前用户是否抢过红包(redsi判断)
- 拦截重复点击操作,防止刷接口。采用redis.setNx操作设置过期时间30秒钟。
- 拦截每秒钟请求数量,使用guava ratelimit 限制请求数量。
service设计
- 判断用户是否领过红包(redis判断),为了防止出现redis缓存不可用情况(数据库判断)
- 查询本地预热数据,判断用户条件
- 调用上游系统验证用户条件
中奖概率设计
中奖概率采用系统生成随机数判断。例如二等奖中奖概率为30%。则在redis中缓存set(“redwar:SLChance”,300);。判断产生的随机数小于300时中二等奖。
初始化红包数据
- 读取数据库活动红包总库存 redis.set(“redWar:201711010009”,25000);
- 分别初始化三个等级奖项红包id入队列,redis.lpush(“redWar:201711010009:FLIds”,id)
- 初始化中奖概率 redis.set(“redWar:SLChance”,300)
- 初始化已经中奖人员信息redis.set(“redWar:user:id”)