> For the complete documentation index, see [llms.txt](https://jun-wang.gitbook.io/learnjava/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jun-wang.gitbook.io/learnjava/ji-shu-xue-xi/jia-gou-xue-xi/miao-sha-xi-tong-she-ji.md).

# 秒杀系统设计

秒杀系统不单单适用于电商的抢购场景，其实一切涉及到大并发的场景都适合于使用该套秒杀系统方案，秒杀系统也是日常工作中经常用到的技术。

## 秒杀系统的难点

* 瞬时大并发：一提到秒杀系统给人最深刻的印象是超大的瞬时并发，这时你可以联想到小米手机的抢购场景，在小米手机抢购的场景一般都会有10w＋的用户同时访问一个商品页面去抢购手机，这就是一个典型的瞬时大并发，如果系统没有经过限流或者熔断处理，那么系统瞬间就会崩掉，就好像被DDos攻击一样；
* 超卖：秒杀除了大并发这样的难点，还有一个所有电商都会遇到的痛，那就是超卖，电商搞大促最怕什么？最怕的就是超卖，产生超卖了以后会影响到用户体验，会导致订单系统、库存系统、供应链等等，产生的问题是一系列的连锁反应，所以电商都不希望超卖发生，但是在大并发的场景最容易发生的就是超卖，不同线程读取到的当前库存数据可能下个毫秒就被其他线程修改了，如果没有一定的锁库存机制那么库存数据必然出错，都不用上万并发，几十并发就可以导致商品超卖；
* 性能：当遇到大并发和超卖问题后，必然会引出另一个问题，那就是性能问题，如何保证在大并发请求下，系统能够有好的性能，让用户能够有更好的体验，不然每个用户都等几十秒才能知道结果，那体验必然是很糟糕的；

## 秒杀系统方案

1. 使用静态页面，方便个渠道分发和横向扩展；
2. 将静态页面提前刷新到CDN，通过CDN缓解访问压力；
3. 禁止重复提交；
4. 对同一个用户记性访问次数限制，防止使用插件频繁调用接口；
5. 在Server端进行流量限流，熔断控制，服务降级，防止影响其他服务；
6. 数据库使用乐观锁，使用多段锁；
7. 使用redis缓存，避免并发问题，异步同步到mysql等数据库；
