大型网站性能优化全面总结(建议收藏)

2023-06-18 0 677

大型网站性能优化全面总结(建议收藏)

掌控操控性强化的有关科学知识,Ganganagar对小型中文网站大网络流量的应用领域非常重要,那时主要就撷取小型中文网站操控性强化文本@mikechen

01

Web后端操控性强化

具体来说,Web后端指中文网站销售业务方法论须要强化,主要包括:

大型网站性能优化全面总结(建议收藏)

1.应用领域程序读取

2.网站快照数学模型

3.相片服务项目

4.CDN服务项目等

主要就强化方式有强化应用领域程序出访,采用逆向全权,CDN等。

1.应用领域程序出访强化

(1)增加http允诺

HTTP协定是无状况的网络层协定,意味著每天HTTP允诺都须要个人简历通信信道,展开传输,而在服务项目器端,每一HTTP都须要开启分立的缓存去处置,那些通讯和服务项目的开支都很高昂,增加HTTP允诺的数量可有效提高出访操控性。

增加HTTP允诺的主要就方式是:

合并CSS,以及压缩CSS大小

合并JavaScript,以及压缩JS大小

合并相片

将应用领域程序一次出访须要的JavaScript,CSS合并成一个文件,这样应用领域程序就只须要一次允诺。多张相片合并成一张,如果每张相片都有不同的超链接,可通过CSS偏移响应鼠标点击操作,构造不同的URL。

(2)采用应用领域程序缓存

对一个中文网站而言,CSS,JavaScript,Logo,图标等那些静态资源文件更新的频率都比较低,而那些文件又几乎是每天HTTP允诺都须要的,如果将那些文件缓存在应用领域程序中,可以极好地改善操控性。通过设置HTTP头中Cache-Control和Expires属性,可设定应用领域程序缓存,缓存时间可以是数天甚至是几个月。有时候,静态资源文件变化须要及时应用领域到客户端应用领域程序,这种情况可以通过改变文件名实现,比如一般会在JavaScript后面加上一个版本号,使应用领域程序刷新修改的文件。

(3)启用压缩

在服务项目器端对文件展开压缩,在应用领域程序端对文件解压缩,可有效较少通讯传输的数据量。文本文件的压缩效率科大80%以上。

(4)CSS放在页面最上面,JavaScript放在页面最下面

应用领域程序会在下载完全部CSS之后对整个页面展开渲染,因此最好的做法是将CSS放在页面最上面,让应用领域程序尽快下载CSS。JS则想法,应用领域程序在读取JS后立即执行,有可能会阻塞整个页面,造成页面显示缓慢,因此JS最好放在页面最下面。

(5)增加Cookie传输

一方面,Cookie包含在每天允诺和响应中,太大的Cookie会严重影响传输,因此哪些数据须要写入Cookie须要慎重考虑,尽量增加Cookie中传输的数据量。另一方面,对某些静态资源的出访,如CSS,JS等,发送Cookie没有意义,可以考虑静态资源采用分立域名出访,避免允诺静态资源时发送Cookie,增加Cookie传输的次数。

2.CDN加速

CDN(Content Distribute Network,内存分发网络)的本质上仍然是一个缓存,而且将数据缓存在离用户最近的地方

CDN一般缓存的是静态资源,如相片,文件,CSS,Script脚本,静态网页等,但是那些文件出访频率很高,将其缓存在CDN可极大改善网页的打开速度。

3.逆向全权

传统全权服务项目器位于应用领域程序一侧,全权应用领域程序将HTTP允诺发送到互联网上,而逆向全权服务项目器位于中文网站机房一侧,全权中文网站Web服务项目器接收HTTP允诺。和传统全权服务项目器可以保护应用领域程序安全一样,逆向全权服务项目器也具有保护中文网站安全的作用,来自互联网的出访允诺必须经过全权服务项目器,相当于在Web服务项目器和可能的网络攻击之间建立了一个屏障。

除了安全功能,全权服务项目器也可以通过配置缓存功能加速Web允诺,当用户第一次出访静态文本的时候,静态文本就被缓存在逆向全权服务项目器上,这样当其他用户出访该静态文本的时候,就可以直接从逆向全权服务项目器返回,加速Web允诺响应速度,减轻服务项目器负载要。

02

应用领域服务项目器操控性强化

应用领域服务项目器就是处置中文网站销售业务的服务项目器,中文网站的销售业务代码都部署在这里,是中文网站开发最复杂,变化最多的地方,强化方式主要就有缓存、集群和异步等。

大型网站性能优化全面总结(建议收藏)

中文网站操控性强化第一定律:优先考虑采用缓存强化操控性。

缓存的本质是一个内存Hash表,中文网站应用领域中,数据缓存以一对Key,Value的形式存储在内存Hash表中。缓存主要就用来存放那些读写比很高、很少变化的数据。

二八定律:80%的出访落在20%的数据上

采用缓存须要注意的问题:

把频繁修改的数据放入缓存。容易出现数据写入缓存后,应用领域还来不及读取缓存,数据就已经失效的情形,徒增系统负担。一般来说,数据的读写比在2:1以上,缓存才有意义。

没有热点的出访。 缓存采用的内存资源非常宝贵,只能将最新出访的数据缓存起来,而把历史数据清理出缓存。即缓存资源应该留给20%的热点数据。

数据不一致与脏读。一般会对缓存设置失效时间,超过失效时间,就要从数据库重新读取。因此应用领域要忍受一定时间的数据不一致。另一种策略是数据更新时立即更新缓存,不过这也会带来更多的系统开支和事务一致性的问题。

缓存可用性。销售业务发展到一定阶段时,缓存会承担大部分数据出访的压力,数据库已经习惯了有缓存的日子,所以当缓存服务项目器崩溃时,数据库会因为完全不能承受如此大的压力而宕机,进而导致整个中文网站不可用。这种情况被称作缓存雪崩,发生这种故障,甚至不能简单地重启缓存服务项目器和数据库服务项目器来恢复中文网站出访。解决方式:1、缓存热备(当某台服务项目器宕机时,将缓存出访切换到热备服务项目器上。);2、缓存服务项目器集群

缓存预热。缓存中存放的是热点数据,热点数据是缓存系统用LRU对不断出访的数据筛选出来的,这个过程须要较长的时间。新开启的缓存系统没有任何数据,此时系统的操控性和数据库负载都不太好。因此可以选择在开启缓存是就把热点数据预读取好。

缓存穿透。因为不恰当的销售业务或恶意攻击,持续高并发地出访某一个不存在的数据,如果缓存不保存该数据,就会有大量的允诺压力落在数据库上。简单的解决方式是把允诺的不存在的数据也放进缓存,其value是null。

对应可以考虑的分布式缓存有memcached、redis,降低对数据库的读操作。

03

数据库SQL操控性强化

大型网站性能优化全面总结(建议收藏)

最后就是考虑数据库端的操控性强化,如果出访量巨大,除了sql强化外,还会涉及到分库分表、读写分离、利用数据库中间件来解决(下面架构师系列有讲),这里就不再重复。

1.对查询展开强化,要尽量避免全表扫描,具体来说应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中对字段展开 null 值判断,否则将导致引擎放弃采用索引而展开全表扫描,如:

select id from t where num is null

3.应尽量避免在 where 子句中采用 != 或 <> 操作符,否则将引擎放弃采用索引而展开全表扫描。

4.应尽量避免在 where 子句中采用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃采用索引而展开全表扫描。

5.in和 not in 也要慎用,否则会导致全表扫描,如:

select id from t where num in(1,2,3)

对连续的数值,能用 between就不要用 in 了:

select id from t where num between 1 and 3

6.对多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则方法论读会很高。

7.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引须要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常采用到的列上建的索引是否有 必要。

8.尽量采用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的操控性,并会增加存储开支。这是因为引擎在处置查询和连 接时会逐个比较字符串中每一个字符,而对数字型而言只须要比较一次就够了。

9.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

10.尽量避免大事务操作,提高系统并发能力。

以上

如果对进大厂&高薪&进阶架构感兴趣,新的一期mikechen高级架构师已经开启了,6.18优惠名额还剩18个

架构,领取阿里架构师进阶从0到1全部合集》。

回复【面试】,领取《Java面试题及答案汇总(2023最新版)

大型网站性能优化全面总结(建议收藏)

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务