APP/网站性能优化方案汇总

目录

一,善用缓存

二,启动优化

三,布局优化

四,加入搜索引擎

五,动静分离

六,集群与分布式

七,Nginx反向代理


一,善用缓存

  • 缓存应用场景
  1. 等待页面:向服务器请求新的数据时,减少等待时间
  2. 没有网络或者网络较慢场景:尽量不出现无法加载的页面或空白页,对变化少的数据内容可提供缓存数据,如通知信息、文字列表等
  3. 流量:提供缓存,为用户减少网络开销
  4. 减少数据库交互:加入缓存,利用缓存速度快优势,减少服务端压力,提升用户访问性能
  • 缓存实现

1、Redis数据缓存

主要以添加redis形式,在分布式背景下,首先形成缓存的负载均衡,减少访问、操作对数据库的压力,再利用redis读写内容特点及内存模型优势,提升访问速度。

2、前端缓存

加入缓存类型实现

①强缓存

强制缓存是向浏览器缓存查找该请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。

浏览器向服务器发起请求时,服务器会将缓存规则放入HTTP响应报文的HTTP头中和请求结果一起返回给浏览器,控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。主要利用Cache-Control的值进行缓存,在XX秒内再次发起该请求,则会直接使用缓存结果,强制缓存生效。加入内存缓存(from memory cache)和硬盘缓存(from disk cache),浏览器在js和图片等文件解析执行后直接存入内存缓存中,刷新页面时只需直接从内存缓存中读取(from memory cache);而css文件则会存入硬盘文件中,所以每次渲染页面都需要从硬盘读取缓存(from disk cache)。

②协商缓存

强制缓存不生效时候,使用协商缓存,主要提供Last-Modified / If-Modified-Since和Etag / If-None-Match形成。协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,重新获取请求结果,再存入浏览器缓存中。

③本地缓存小容量

组合使用Cookie、LocalStorage、SessionStorage:

Cookie用于用户信息的存储,Cookie的内容可以自动在请求的时候被传递给服务器。LocalStorage的数据将一直保存在浏览器内,直到用户清除浏览器缓存数据为止。SessionStorage的其他属性同LocalStorage,只不过它的生命周期同标签页的生命周期,当标签页被关闭时,SessionStorage也会被清除。

④本地缓存大容量

WebSql和IndexDB主要用在前端有大容量存储需求的页面上。

⑤往返缓存

利用bfcache实现:当用户前往新页面时,将当前页面的浏览器DOM状态保存到bfcache中;当用户点击后退按钮的时候,将页面直接从bfcache中加载,节省了网络请求的时间。

3、缓存图像

重用图片使用imageNamed,在系统缓存一个图像对象并指定名字,如果存在则返回对象,如果匹配图像的对象不在缓存中,这个方法会从指定的文件中加载数据,并缓存它,然后返回结果对象。

一次大图片使用imageWithContendsOfFile,不浪费内存来缓存图片。

4、页面缓存

将应用生成的页面缓存起来,不需要每次都生成页面,以此节省大量的CPU资源,本次使用Nginx服务器自带的缓存功能,页面缓存机制采用默认机制,按缓存时间处理。

页面缓存主要用在数据很少发生变化的页面,但是很多页面是大部分数据都很少发生变化,而其中很少一部分数据变化频率却非常高,

比如:

一个显示文章的页面,正常完全可以静态化,但是如果文章后面有“顶”和“踩”的功能而且显示的有响应的数量,这个数据的变化频率就比较高了,这就会影响静态化。

方案:

可以用先生成静态页面然后使用Ajax来读取并修改响应的数据,这样就可以一举两得来,既可以使用页面缓存也可以实时显示一些变化频率高的数据来。

纯静态化的html页面效率最高、消耗最小,对于交互性要求很高的页面,采用静态化来提高性能,将内容进行实时的静态化,有更新的时候再重新静态化。

二,启动优化

采取策略分为冷启动和热启动。

冷启动:应用第一次启动的时候,系统会为应用创建一个新的进程,所以首先会创建和初始化appliction类,然后再创建和初始化activity类(包括测量、布局、绘制),最后显示在界面上。流程:启动->创建Application->attchBaseContext()->onCreate()->Activity生命周期

热启动:热启动从已经有的进程中启动,所以不会再去创建和初始化application,直接创建和初始化activity,application只会初始化一次,只包含activity中的生命周期流程。

三,布局优化

1、减少层级。合理使用 RelativeLayout 和 LinerLayout,合理使用Merge。

2、提高显示速度。使用 ViewStub,它是一个看不见的、不占布局位置、占用资源非常小的视图对象。

3、布局复用。可以通过 标签来提高复用。

4、尽可能少用wrap_content。wrap_content 会增加布局 measure 时计算成本,在已知宽高为固定值时,不用wrap_content 。

5、删除控件中无用的属性。

四,加入搜索引擎

通过加入ES搜索引擎提升APP搜索能力,通过ES的以下特性实现性能提高:

接近实时(NRT):从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒)。

集群(cluster):共同持有整个数据,并一起提供索引和搜索功能。

节点(node):一个节点是集群中的一个服务器,作为集群的一部分,存储你的数据,参与集群的索引和搜索功能。

索引(index):索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。

类型(type):在一个索引中,可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。具有一组共同字段的文档定义一个类型。

文档(document):文档是一个可被索引的基础信息单元。

分片和复制(shards & replicas):Elasticsearch提供了将索引划分成多份的能力,当创建一个索引的时候,可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。

通过添加ES搜索引擎,很好的管控所有的服务器的数据,并且做好冗余备份,通过ES特性,大幅度提升搜索速度,例如:通过各种算法(例如红黑树)等。

五,动静分离

并发量达到一定程度开始使用动静分离策略,将静态资源保存到专门的服务器中,静态资源主要包括图片、视频、js、css和一些资源文件等,这些文件因为没有状态所以分离比较简单,直接存放到响应的服务器就可以了,一般会使用专门的域名去访问。

通过不同的域名可以让浏览器直接访问资源服务器而不需要再访问应用服务器,以此减轻服务器压力,通过配置nginx服务来实现动静分离,并实现nginx服务的集群模式,架构图如下:

六,集群与分布式

集群策略是定义为集群的服务器每台都具有相同的功能,处理请求时调用哪台服务器都可以,主要起分流作用。

分布式将不同的业务放到不同的服务器中,处理一个请求需要用到多台服务器,这样可以提高一个请求的处理速度。

本次优化采用集群+分布式组合策略,来提升扩展能力和性能上的优化。

集群有两个方式:一种是在静态资源集群,另一种是应用程序集群。

静态集群即多台存储静态文件的服务器,提供多服务器的静态资源访问能力,让访问压力分散化。

应用集群即把动态应用部分分散到多个服务器,主要解决的是多服务器之间的session问题,主要采取token来实现session同步问题,主要实现方法如下:

1、access_token

服务端应用程序 api 接口访问和调用的凭证。

使用具有较长生命周期的会话 token 来换取此接口访问 token。

曝光频率直接和接口调用频率有关,属于高频使用的凭证。为了照顾到隐私性,尽量减少其生命周期,即使被截取了,也不至于产生严重的后果。 access_token,主要是为了让具有不同生命周期的客户端 token 最后在调用 api 的时候, 能够具有统一的认证方式。

2、pam_token

已经登录和认证的 PC 端生成的二维码的原始串号(Pc Auth Mobile)。

主要步骤:

①PC 上用户已经完成认证,登录了系统

②PC 端生成一组和此用户相关联的 pam_token

③PC 端将此 pam_token 的使用链接生成二维码

④移动端扫码后,请求服务器,并和用户信息关联

⑤移动端获取 refresh_token(长时效的会话)

⑥根据 refreshtoken 获取 accesstoken

⑦完成正常的接口调用工作

3、map_token

已经登录的移动 app 来扫码认证 PC 端系统,并完成 PC 端系统的登录(Mobile Auth Pc)。

主要步骤:

①移动端完成用户身份的认证登录 app

②未登录的 PC 生成匿名的 map_token

③移动端扫码后在 db 中生成 map_token 和用户关联(完成签名)

④db 同时针对此用户生成 web_token

⑤PC 端一直以 maptoken 为参数查找此命名用户的 webtoken

⑥PC 端根据 webtoken 去获取 accesstoken

⑦后续正常的调用接口调用工作

七,Nginx反向代理

nginx拥有轻量级、高性能、多进程等特征,非常适合访问量巨大的场景,通过nginx实现反向代理服务,以此来实现高并发场景的各种能力。

安装nginx在多台服务器上形成nginx集群,根据实际情况配置worker_processes、worker_cpu_affinity、worker_rlimit_nofile等参数来优化反向代理性能及对访问的高并发支持。

Nginx优势

①可以高并发连接

Nginx能够支撑5万并发连接,实际生产环境中可以支撑2~4万并发连接数。Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freeBSD)网路I/O模型,而Apache使用的是传统的Select模型,其比较稳定的Prefork模式为多进程模式,需要经常派生子进程,所以消耗的CPU等服务器资源,要比Nginx高很多。

②内存消耗少

在3万并发连接下,开启10个Nginx进程消耗150MB内存,15MB*10=150MB,开启的64个PHP-CGI进程消耗1280内存,20MB*64=1280MB,加上系统自身消耗的内存,总共消耗不到2GB的内存。

如果服务器的内存比较小,完全可以只开启25个PHP-CGI进程,这样PHP-CGI消耗的总内存数才500MB。

③成本低廉

购买F5BIG-IP、NetScaler等硬件负载均衡交换机,需要十多万到几十万人民币,而Nginx为开源软件,采用的是2-clause BSD-like协议,可以免费试用,并且可用于商业用途。BSD开源协议是一个给使用者很大自由的协议,协议指出可以自由使用、修改源代码、也可以将修改后的代码作为开源或专用软件再发布。

④配置文件非常简单

网络和程序一样通俗易懂,即使,非专用系统管理员也能看懂。

⑤支持Rewrite重写

能够根据域名、URL的不同,将http请求分到不同的后端服务器群组。

⑥内置的健康检查功能

如果NginxProxy后端的某台Web服务器宕机了,不会影响前端的访问。

⑦节省带宽

支持GZIP压缩,可以添加浏览器本地缓存的Header头。

⑧稳定性高

用于反向代理,宕机的概率微乎其微。

⑨支持热部署

Nginx支持热部署,几乎可以7天*24小时不间断的运行,即使,运行数个月也不需要重新启动,还能够在不间断服务的情况下,对软件版本进行升级。

Nginx主要作用

①作为前端服务器跟实际处理请求的服务器集成。

②负载均衡+故障转移。

③转发请求,比如可以将不同类型的资源请求转发到不同的服务器去处理。

④高并发访问

八,CDN

CDN内容分发网络,可作为一种特殊的集群页面缓存服务器,和普通集群的多台页面缓存服务器相比,主要是存放的位置和分配请求的方式有一定特殊性。

CDN服务器分布于全国各地的,当接收到用户请求后会将请求分配到最合适的CDN服务器节点获取数据。比如A企业的用户分配到A的节点,上海的用户分配到上海的节点。

CDN的每个节点作为一个页面缓存服务器,如果没有请求资源的缓存就会从主服务器获取,否则直接返回缓存的页面。

CDN分配请求(负载均衡)的方式是用专门的CDN域名解析服务器在解析域名的时候就分配好的。可在ISP哪里试用CNAME将域名解析到一个特定的域名,然后再将解析到的那个域名用专门的CDN服务器解析道相应的CDN节点。如图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戰士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值