秒杀系统分析
一、秒杀核心业务分析
应用:商品抢购、优惠券的领取
技术难点:
- 短时高并发、负载压力大
- 读多写少
- 竞争资源有限,不能多买,不能少买,不能重买
重要点:修改库存
二、关于锁的那些事:
1、悲观锁:在数据处理过程中,将数据处于锁定状态【依靠数据库提供的锁机制】
使用场景:写多读少,保证数据安全
2、乐观锁:在数据提交更新是,才会正式对数据的冲突与否进行检测。如果发现冲突,让用户决定如何去做或者程序自动重试。
使用场景:读多写少,提高系统吞吐量
乐观锁只是在更新表的那一刻锁表,其他时间不锁表,所以相对于悲观锁,吞吐量更高。
三、秒杀核心服务实战:
1、基于mysql通过版本号实现
update t_goods_info
set amount = amount - #{buys} , version = version+1
where code = #{code} and version = #{version}
缺点:需要加version字段
2、基于mysql通过状态实现
update t_goods_info
set amount = amount - #{buys}
where code = #{code} and amount - #{buys} >=0
3、使用缓存:
基于redis实现:利用watch指令在redis事务中提供CAS的能力
基于memcached的cas机制实现:
读取数据-〉比较版本 -〉更新数据
- 通过gets命令获取数据库版本号
- 检查库存是否大于购买数量
- 使用cas更新商品库存(带版本号),如果更新失败,当前线程休眠重试,并错峰执行,避免请求同一时间并发。
数据库乐观锁实现的优点:简单高效、稳定可靠,缺点:并发能力低,数据库并发瓶颈值300-700
四、秒杀系统架构设计