APP下载

《JAVA——帮你解决高并发秒杀》

消息来源:baojiabao.com 作者: 发布时间:2026-05-21

报价宝综合消息《JAVA——帮你解决高并发秒杀》

准备

首先我们要考虑的是为什么要解决高并发,高并发瓶颈出现在哪里,有了解过的朋友肯定知道是在数据库,因为在大量请求去操作数据库时会出现资料的错乱,超卖,系统崩溃,mysql死锁等现象。

【思路】

(一)、 页面静态化:就是将整个页面储存到redis中,下次访问时去读取redis中的页面值

(二)、主要对整个网站的静态资原始档进行加速,如图片,css,js等

(三)、数学验证码:使用者在计算验证码结果时可以减少大量请求同时进入,减少redis, mysql,服务器的压力。

(四)、库存标识:这是一个巨大优化,通过标识来判断redis的库存是否足够,如不足就中断去读取redis库存。例:boolean over = map.get(goodsId);当我们map通过key读取到value值为true的时候,就返回错误提示给使用者, if(over) { return Result.error(‘库存不足’); }.....这样不管以后有多个请求进入都只执行两行程式码,以下的操作无法进入。

(五)、生成动态url:主要是防止恶意使用者通过固定url进行提前秒杀商品(安全方面问题这个不可掉以轻心,你连安全措施都没做好以下的那些操作都是白搭的)

(六)、 redis预减库存:在使用者秒杀商品前去redis获取当前的库存数量,然后在秒杀时候直接减去redis储存的库存(大家放心这里Redis和MySQL资料是同步的,只要进入MQ伫列操作完成下单,MySQL数据库会-1数量),从而避开去MySQL读取库存资料。

(七)、MQ讯息伫列:它是一个中间讯息键,通过生产者传送讯息给消费者,进行业务操作,而生产者无需知道执行结果,也就是使用者点选秒杀之后等待处理结果,之后再去轮询查询处理结果(异步操作),这样就避开了不断请求去操作数据库。(这里的轮询查询也是直接从redis里面去查询,因为秒杀成功之后会将秒杀的结果放到redis中,轮询时候通过key去查询)

(八)、Nginx:解决高并发的好方法,也就是我们多增加几个tomcat服务器。当用户访问的时候,请求可以提交到空闲的tomcat服务器上。

(九)、数据库丛集、库表杂凑

①大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库丛集或者库表杂凑。

②在数据库丛集方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。

③上面提到的数据库丛集由于在架构、成本、扩张性方面都会受到所采用DB型别的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表杂凑是常用并且最有效的解决方案。

④我们在应用程序中安装业务和应用或者功能模组将数据库进行分离,不同的模组对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库杂凑,比如使用者表,按照使用者ID进行表杂凑,这样就能够低成本的提升系统的效能并且有很好的扩充套件性。

(十)、负载均衡

负载均衡将是大型网站解决高负荷访问和大量并发请求采用的高阶解决办法。

(十一)反向代理

客户端直接访问的服务器并不是直接提供服务的服务器,它从别的服务器获取资源,然后将结果返回给使用者。

代理服务器和反向代理服务器:

代理服务器是代我们访获取资源,然后将结果返回。例如,访问外网的代理服务器。反向代理服务器是我们正常访问一台服务器的时候,服务器自己呼叫了别的服务器。

反向代理就是说,使用者的请求请求到负载均衡的装置上,负载均衡装置再讲请求分发到空闲的应用服务器上处理,处理完成之后再通过负载均衡装置返回给使用者,这样对于使用者来说,后来的分发是不可见的。

反向代理的实现

1)需要有一个负载均衡装置来分发使用者请求,将使用者请求分发到空闲的服务器上

2)服务器返回自己的服务到负载均衡装置

3)负载均衡将服务器的服务返回使用者

代理服务器我们主动使用,是为我们服务的,不需要有自己的域名;反向代理是服务器自己使用的,我们并不知道,有自己的域名。

2019-12-24 23:51:00

相关文章