1,秒杀的思路:
核心思想就是尽可能的减少访问mysql的次数;
最常用的技术就是页面静态化和Redis的相结合,将一些固定少变动的数据生成静态页面缓存在用户的浏览器内存中,减少频繁去访问数据库;将一些像库存等热点信息单独出来放到redis中,来减缓mysql的压力;
- 首先是最基本的三层架构,用户通过浏览器发送请求访问后端服务器,服务器调用接口访问mysql查询数据返回。
- 这里高并发下mysql肯定承受不住压力,所以需要加入Redis作为缓存缓解mysql压力,请求先从Redis中查询数据,若Redis中有则返回前端,没有则访问mysql。
- 但是查询Redis的话怎么都还是会有网络请求,避免不了一些网络IO以及带宽的一些浪费,这里就可以使用多级缓存,在活动开始前就先将热点数据放到JVM内存中,以及Redis也可以做一个缓冲预热,然后这个时候就直接走的JVM内存没有网络IO这些,会相对更快一些。由于JVM的内存资源比较珍贵,所以尽可能的只放热点数据吧,否则可能会使JVM内存中产生脏数据,影响性能,当JVM内存中没有的时候才去查Redis,Redis没有才查数据库。
- 但是即使是JVM并发量也是有限的,那假设我一台机器可以扛1w并发,那我就搞十台机器来扛10w并发,所以可以扩展服务器节点,搭建集群,通过Nginx反向代理用一些轮询算法或者是加权轮询算法做负载均衡。
- 想要让系统越快,就得将缓存放在离用户越近的地方,由于现在浏览器最优先访问的是Nginx,所以可以考虑让Nginx直接去访问Redis,这样就不需要将请求打到后端服务器上了
- 并且防止Redis宕机造成缓存雪崩,Redis也可以建立集群,来提高服务的稳定性
