秒杀系统,是典型的短时大量突发访问类问题。对这类问题,有三种优化性能的思路:linux
1. 写入内存而不是写入硬盘、算法
2. 异步处理而不是同步处理、sql
3. 分布式处理缓存
用上这三招,不论秒杀时负载多大,都能轻松应对。更好的是,Redis可以知足上述三点。所以,用Redis就能轻松实现秒杀系统。 用我这个方案,不管是电商平台特价秒杀,12306火车票秒杀,都不是事:)性能优化
下面介绍一下为何上述三种性能优化思路可以解决秒杀系统的性能问题:服务器
Redis和Redis Cluster(分布式版本),是一个分布式缓存系统。其支持多种数据结构,也支持MQ。Redis在性能上作了大量优化。所以使用Redis或者Redis Cluster就能够轻松实现一个强大的秒杀系统。 基本上,你用Redis的这些命令就能够了。 RPUSH key value 插入秒杀请求网络
当插入的秒杀请求数达到上限时,中止全部后续插入。 后台启动多个工做线程,使用 LPOP key 读取秒杀成功者的用户id,进行后续处理。 或者使用LRANGE key start end命令读取秒杀成功者的用户id,进行后续处理。 每完成一条秒杀记录的处理,就执行INCR key_num。一旦全部库存处理完毕,就结束该商品的本次秒杀,关闭工做线程,也再也不接收秒杀请求。数据结构
也许你会说,咱们的客户不少。即便部署了Redis Cluster,仍然撑不住。那该怎么办呢? 记得某个伟人曾经说过:办法总比困难多!架构
下面,咱们具体分析下,还有哪些状况会压垮咱们架构在Redis(Cluster)上的秒杀系统。并发
如如今有不少抢火车票的软件。它们会自动发起http请求。一个客户端一秒会发起不少次请求。若是有不少用户使用了这样的软件,就可能会直接把咱们的交换机给压垮了。
这个问题其实属于网络问题的范畴,和咱们的秒杀系统不在一个层面上。所以不该该由咱们来解决。不少交换机都有防止一个源IP发起过多请求的功能。开源软件也有很多能实现这点。如linux上的TC能够控制。流行的Web服务器Nginx(它也能够看作是一个七层软交换机)也能够经过配置作到这一点。一个IP,一秒钟我就容许你访问我2次,其余软件包直接给你丢了,你还能压垮我吗?
可能大家的客户并发访问量实在太大了,交换机都撑不住了。 这也有办法。咱们能够用多个交换机为咱们的秒杀系统服务。 原理就是DNS能够对一个域名返回多个IP,而且对不一样的源IP,同一个域名返回不一样的IP。如网通用户访问,就返回一个网通机房的IP;电信用户访问,就返回一个电信机房的IP。也就是用CDN了! 咱们能够部署多台交换机为不一样的用户服务。 用户经过这些交换机访问后面数据中心的Redis Cluster进行秒杀做业。
有了Redis Cluster的帮助,作个支持海量用户的秒杀系统其实So Easy! 这里介绍的方案虽然是针对秒杀系统的,但其背后的原理对其余高并发系统同样有效。 最后,咱们再重温一下高性能系统的优化原则: 写入内存而不是写入硬盘、异步处理而不是同步处理、分布式处理。
群内提供免费的Java架构学习资料,QQ群:643459718 (里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码, MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)