上一篇写了关于抽奖算法的实现,本文就抽奖的高并发做简单的介绍
其实抽奖和秒杀系统的很多相似的地方,都会有这几个问题:
- 防止用户非法请求
- 并发请求比较大
- 数据库压力大
方案:
- 负载均衡
- 缓存
- 多线程
- 异步
- …
流程:
- 初始化-把抽奖活动和奖品数据都放到redis缓存
- 当有用户参与抽奖活动就从redis把奖品列表取出来调用之前提到的算法
- 如果中奖更新redis数据,同时提交任务到线程池,更新数据库中奖品的数量同时保存抽奖结果到数据库
为了利用redis的decr
功能来保证修改奖品余量的一致性,每一个奖品的余量需要在redis中单独做缓存
效果:
对于每一个用户ID,把当前抽奖的次数记录到redis,每次抽奖之前到redis取数据检查,如果存在相应记录直接返回结果(在最一开始就拦截非法请求)
中奖的时候使用多线程异步处理结果,目的有两个:
- 让http请求尽快返回结果,释放连接数
- 达到任务队列的效果,减轻数据库压力
总结:
- 对非法请求尽量在最一开始就做出判断并返回
- 对高并发需要处理的数据放缓存
- 处理结果使用队列来保存,减少数据库压力的同时让http尽快返回