秒杀系统分析

一、秒杀核心业务分析

应用:商品抢购、优惠券的领取

技术难点:

  • 短时高并发、负载压力大
  • 读多写少
  • 竞争资源有限,不能多买,不能少买,不能重买

重要点:修改库存

二、关于锁的那些事:


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

四、秒杀系统架构设计

原文地址:https://www.cnblogs.com/wjh123/p/11530720.html