文章插图
缓存
这个也比较常见了 。缓存也在好多个环节中发生奇效:
数据从数据库到浏览器的过程:数据库->应用数据集->内存对象->动态页面->HTTP服务器->用户浏览器 。
HTTP服务器->用户浏览器:浏览器都有本地缓存
动态页面->HTTP服务器:动态页面静态化 。然后把静态化页面放在缓存里
本地数据集->内存对象->动态页面:一些语言框架本身就带缓存机制 。也可以使用Memcached或Redis 。
数据库->应用数据集:数据库有查询缓存
图片服务器分离
图片存储在单独的图片服务器上 。
数据库读写分离/分库分表等
一台服务很难满足业务上的压力 。那么数据库可以做读写分离 。或者分库分表 。
文章插图
负载均衡
负载均衡分硬件和软件 。硬件我们用过F5 。软件经常用的是Nginx 。
后台应用部署多套 。前面挂负载均衡 。客户端都直接访问负载均衡 。由它把访问分摊到实际应用服务器上 。
文章插图
镜像
解决不同网络接入商和地域带来的用户访问速度差异 。
CDN
CDN=更智能的镜像+缓存+流量导流
希望我的回答可以帮助到你!
其他观点:
感觉面试过程中一定会问到的问题有三个 。多线程 。JVM 。高并发!
文章插图
何谓并发?同时处理操作!
何谓高并发?同时处理很多操作!
什么操作呢?页面请求:一个简单的页面请求可能包含了很多内容 。比如验证登录 。静态页面加载 。动态数据加载(涉及到访问数据库 。缓存等等) 。图片加载 。线程的启动和销毁!每一个操作都需要花费时间 。总得加起来可能只有200ms 。但是如果你的服务器处理能力只能是一个请求级别的 。那么100万个请求 。你就需要20万秒 。大概是几天的时间!
当然实际生活中我们没有这么水的服务器 。换句话说 。我们可以通过选择好的服务器来提高我们的并发能力!也就是说硬件的指数型升级能让我们应付高并发 。但是事与愿违 。如果处理一个请求占用的是100k内存 。那么100万请求就需要100万M 。也就是差不多100G的内存!这无疑是现实生活中还没有的!
文章插图
在此之前 。我们先来熟悉几个关于高并发的关键参数!
QPS:每秒处理的请求数量!
响应时间:处理一个请求需要的时间!
吞吐量:单位时间内的处理请求数量!
最大并发数:同一时间能支持的最大请求数!
文章插图
一般来说有下面这些常规办法:
1 。更多的静态资源:将代码中的大量枚举(容器加载时写入map 。放入本地缓存) 。数据库中的定义表(定时任务放入缓存) 。固定配置 。HTML文件等静态化处理 。缓存起来!
2 。图片服务器:一般来说 。图片在一个页面上属于数据量比较大的东西 。尽量避免动态数据和图片的顺序渲染 。使用图片服务器分离数据和图片!
3 。优化代码:尽量避免多层循环 。避免多次访问数据库 。使用多线程提高cpu使用率和执行速度 。使用java8的流式处理和并行处理提高速度!
4 。数据库:采用分库分表 。mysql5.7之后 。据说可以支持秒级百万级数据查询 。速度相当之快 。使用八库1024表 。可以满足数据库一秒数百万的并发!同时可以开启缓存 。写入存储过程等加快访问时间!分库分表之后还可以根据分表字段使用联合查询 。避免了大多数数据库架构分布式之后不能联合查询的缺点!
5 。使用内存型数据存储:使用redis等内存缓存可以提高读写速度 。在数据落库之前快速读写数据 。使用mongodb等作为大字段 。多字节的key value保存方式 。防止关系型数据库的不足!
6 。负载均衡:使用nginx等负载均衡中间件 。将请求分布到不同的机器上 。避免单个应用持续的处理引起血崩!
总之 。高并发是一项程序员必不可少缺的技术 。也是面试必问的知识点 。只有直面它 。解决它才能对技术有更深的认识!
高并发的路上踩了很多坑 。以后再记录下这些坑 。和大家共勉!
推荐阅读
- 梦见擀面杖断了 梦见擀面杖
- 君子兰栽多深好 君子兰栽多深好养活
- 红掌可以用啤酒浇吗 红掌能用啤酒水浇吗
- 电热水壶煮鸡蛋为什么煮不熟
- 红豆杉一年长多少厘米正常 红豆杉一年长多少厘米
- 七夕节送什么花给女朋友最好呢 七夕节送什么花给女朋友最好
- 在欧洲民粹主义的政治旋风中,立陶宛也会选出“体系外”总统吗?
- 优化网站有哪些html标签需要优化?
- 家里为啥不能养荷花 为什么家里不能养荷花