SpringMVC 实现抽奖活动(1.设计部分)
抽奖活动的需求分析如下:
争议点:
- 是否需要保证奖品能抽完,若是则每次中奖的概率会越来越大,否则每次概率保持一样即可
如果中奖的概率设为1%,则抽100次抽中的概率(样品数每次会减1)为:1 - 99/100 * 98/99*……1/2,大约为百分之八十几
良好的可扩展性、可配置性:
- 每次用户参与抽奖应同时记录抽奖时间,方便以后需求的扩充
- 奖品种类和数量的扩充
难点
- 多实例并发控制,竞争资源(需考虑两个并发场景,1.单用户并发抢码;2.多用户并发抢码)
实现方式
考虑到线上会部署多台实例,故不能在java代码中加锁,需要使用redis分布式锁或者数据库加锁的方式
- for update悲观锁
- 基于version的乐观锁
具体实现见下文