当前位置: 首页 > news >正文

《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)负载均衡将服务器的服务返回用户

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

转载于:https://blog.51cto.com/14257001/2409654

相关文章:

  • MyBatis源码分析-MyBatis初始化流程
  • 左神算法进阶班1_4Manacher算法
  • centos下安装mysql5.7
  • [Hadoop in China 2011] 蒋建平:探秘基于Hadoop的华为共有云
  • 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
  • PHP删除MySQL数据库下的所有数据表
  • 记:使用Xenocode加壳混淆后,无法“自杀覆盖”的自动更新
  • 数组相关排序
  • 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  • Java基础学习总结(23)——GUI编程
  • JDBC 通过PreparedStatement 对数据库进行增删改查
  • JPA常用注解
  • php的插入排序,通过双层for循环
  • 我的Git忽略文件
  • SCSS(SASS、CSS)学习
  • 【Leetcode】101. 对称二叉树
  • [译]如何构建服务器端web组件,为何要构建?
  • canvas 绘制双线技巧
  • Java,console输出实时的转向GUI textbox
  • java概述
  • Java知识点总结(JavaIO-打印流)
  • React-flux杂记
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Vim 折腾记
  • vue.js框架原理浅析
  • 测试如何在敏捷团队中工作?
  • 二维平面内的碰撞检测【一】
  • 基于HAProxy的高性能缓存服务器nuster
  • 计算机常识 - 收藏集 - 掘金
  • 小李飞刀:SQL题目刷起来!
  • 写给高年级小学生看的《Bash 指南》
  • 因为阿里,他们成了“杭漂”
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #QT(串口助手-界面)
  • $NOIp2018$劝退记
  • (11)MSP430F5529 定时器B
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (多级缓存)多级缓存
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .cfg\.dat\.mak(持续补充)
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .Net Core 中间件验签
  • .net 获取url的方法
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET建议使用的大小写命名原则
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @test注解_Spring 自定义注解你了解过吗?
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • @在php中起什么作用?
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [20150707]外部表与rowid.txt