我在面试别人的时候,常常会问对方,如何设计一个秒杀系统?回答的好的同窗并很少,这里我简要说一下考察这个问题的目的.秒杀系统,那么顾名思义就是抢购,库存有限状况下的竞争问题,其实就是一个高并发的处理.html
首先咱们模拟不作并发处理的状况:前端
好比咱们用户一个库存表 stock,库存数量5面试
咱们对外提供了一个接口供前端调用,redis
这个接口,只是简单的判断了库存数量是否大于0,若是小于0则返回失败.网络
咱们重开一个控制台程序,模拟10个线程并发并发
能够看到,咱们成功了7次,而库存只有5个,说明咱们超卖了2个.异步
那么要如何解决这个并发问题呢?高并发
很简单能够利用redis的原子性,让redis把无效的请求遮挡掉.net
这样就没有并发问题了.线程
这里讲解下什么是redis的原子性:
一、Redis是单进程单线程的网络模型,用的是epoll网络模型,网络模型都是单线程异步非阻塞处理网络请求
二、Redis的单线程处理全部的客户端链接请求,命令读写请求。(有些任务好比rdb和aof等操做是fork子进程处理的,不会影响redis主线程处理客户端的命令)
三、Redis提供的全部API操做,相对于服务端方面都是one by one执行的,命令是一个接着一个执行的,不存在并行执行的状况。
扩展阅读: