前言:秒杀系统需要保证商品库存不能出现超卖现象。
一、数据库锁机制(悲观锁、乐观锁)实现秒杀
(1)悲观锁:数据库本身支持的行级锁,
update item set num=num-1 where id=1 and num >=0 update语句自动带上行级锁,select * from item where id=1 for update 执行的时候加上锁。
缺点:数据库承受高并发能力有限,是一个很大的瓶颈,如果瞬间高并发访问极容易导致数据库奔溃。
(2)乐观锁:在数据库表中设置一个version字段,线程获取到正确的版本号就可以执行更新操作,缺点:多个线程同时执行的时候会有更新失败的情况,导致购买失败,实际情况不建议采用这种方案。
二、进程内队列(LinkedBlockingQueue、ArrayBlockingQueue、ConcurrentLinkedQueue)实现秒杀
优点:队列能够按照数据库能够承受的压力慢慢进行,解决了数据库无法承受高并发访问的瓶颈问题。
缺点:分布式系统中将失去效果。
三、分布式锁(redis、ZooKeeper)
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。
优点:能够在分布式系统使用,解决了分布式系统不能同步访问的问题,性能上比在数据库使用锁要高。
缺点:使用锁的过程要避免死锁、锁被谁释放等问题
四、分布式队列(kafka\rabbitmq\rocketmq,redis也能实现)
优点:分布式队列能够按照数据库能够承受的压力慢慢进行,解决了数据库无法承受高并发访问的瓶颈问题。
缺点:有可能会发生消息丢失、重复消费等问题,需要对这些问题进行处理。