秒杀系统有两个重要问题
- 高并发
- 超卖问题
- 使用redis缓存,秒杀系统是典型的读多写少的场景,利用内存能提高并发性。在秒杀前,将秒杀时的热点数据载入内存。redis是单线程模型,所以保证了写操作的原子性。
- 使用两个消息队列。一个消息队列,只能存入商品库存大小个的元素,用户的请求放在这里,丢弃超出个数的请求。程序从该消息队列中取出请求,然后在redis中减库存,若减库存成功,将用户信息和商品信息放入另一个消息队列。其他系统从消息队列中取出用户信息和商品信息生成订单。还要有一个线程来将redis中的库存同步到数据库。
- 控制消息队列中的请求数、减库存都需要用到具有原子性的计数器,比如AtomicInteger。