前沿拓展:
网站性能优化方案
一、无图片技术定义
在不使用CSS Image(通过CSS的引入的背景图片,不包括img标签内的图片)情况下生成类似图片效果的技术;换句话的意思就是在使用纯CSS生成类似图片效果的技术。
二、为什么要“无图片”?
首先我们通过yslow的statistics查看新浪微博最新版首页的文件,得到Stylesheet File(CSS文件)大小为206.8K, CSS Image大小为623.8K。明显发现CSS文件比CSS Image小很多。
当然单纯拿这两个来比,还不能说明什么。
下面我们通过计算来说下CSS文件与CSS Image关系
CSS Image是由一系列的图片组成,每一张图,即使最小一个小箭头(如下图),你存成一张图片,怎么也得1KB吧。
例如微博的这个小三角图形:
如果我们全部以CSS的形式模拟这个小箭头,空间资源会占多少?我们来计算一下,首先贴下代码
HTML代码如下:
CSS代码如下:
从上面的代码可以看出,在CSS文件中总共不到200个字符,如果我们按照1字符等于1B的来计算的话,200个字符大概等于0.2KB,比直接用图片做节约了4/5的下载资源,明显减少请求资源的大小。如果我们尽可能的使用无图片技术来实现,明显可以提高页面的加载速度;其次,我们知道每一个 CSS image都需要一个http请求去加载,浏览器每次发出的请求个数是有限的,减少CSS image的个数,显然减少了http请求数,也就提高页面的呈现速度;再次,经常使用微博的同学都知道,微博是可以换肤,如果使用CSS无图片技术,我们仅需要简单换一下CSS属性就能实现换肤,提高了代码的可维护性。
通过以上分析,使用CSS无图片技术,可以总结得到以下3个优点:
减少请求资源的大小
减少http的请求个数
提高可维护性
三、CSS无图片技术,微博中有哪些实际应用呢?
通过上面的展示,我们可以看到,无图片技术,在微博上应用是十分普遍的。
四、无图片技术的实现方式
大概有四种方式:一是通过background-color、border生成图片;二是通过字符生成图片;三是通过CSS3 的gradient等生成图片(这个要考虑低级浏览器不兼容的问题);四是CSS3的自定义字体(@font-face)生成图片。
利用CSS的background-color、border属性可以生成一些图形,例如三角。纯粹的CSS2的内容,完全可以兼容IE6。
1)用background-color生成的小方块,效果如下:
CSS代码:
2)用border生成的小方块,效果如下:
CSS代码:
3)用border生成的小三角,效果如下:
CSS代码:
4)用border生成的尖三角,效果如下:
CSS代码:
5)用border生成的斜三角,效果如下:
HTML结构:
CSS代码:
通过以上5种图形,可以得到以下图形,效果图如下。
这里只贴一下中间图形的代码,其他的,要兴趣的同学可以自己去研究,更多有意思的图形等着你去完成。
HTML结构:
CSS代码:
2.通过字符生成图片,例如尖角、圆点以及箭头,这也是CSS2范畴,完全可以兼容ie6。这个在博中使用广泛,这里不单独写demo了。
1)尖角,效果图如下
HTML结构:
CSS代码:
2)圆点,效果图如下
HTML结构:
CSS样式:
3)箭头,效果图如下
HTML结构:
CSS样式:
微博名人堂没做具体的定义,但是建议可以对字体样式做些限制,以便在各种浏览器表现一样。
3.CSS3生成图片,使用box-shadow,border-radius,gradient渐变等CSS3的新属性生成图形,IE浏览器下渐变背景的使用需要使用IE的渐变滤镜,但是使用滤镜资源会消耗很大,所以,根据项目实际情况去权衡是否使用滤镜。
先看下谷歌搜索按钮的例子
CSS样式:
GOOGLE搜索这个按钮没有使用滤镜,IE浏览器就没有做渐变处理,大家都知道GOOGLE是非常在意性能的公司,有些时候为了极致的性能,稍微牺牲一下视觉体验也是可以接受的。
再看一下淘宝网“查看更多”的按钮
CSS样式:
淘宝网这个按钮使用滤镜,可以完美兼容IE,当然这也不能去猜测淘宝不注重性能,只能说视觉体验和性能博弈的结果。
4. CSS3的自定义字体(@font-face)生成图片,虽然这个方法不属于真正意义的无图片,但是容易编辑和维护,更重要的是它的尺寸,颜色可以通过CSS来控制,这间接地做到少使用图片。
具体应用,微博微吧的ICON
HTML结构:
CSS样式:
至于具体实现方式的理论基础,要展开写,又是一篇文章,有兴趣的同学参考一下@神飞写的《CSS3 icon font完全指南》http://www.***.net/css3-icon-font-guide.html。
总之,CSS无图片技术,是我们在写CSS样式中需要形成的一种理念,我不必死磕无图片技术,要在实际的项目权衡利弊,根据实际情况,灵活运用无图片技术做一些合理有效的性能优化。
性能优化基本属于Java高级岗的必备技能了,特备对于大流量的互联网应用至关重要@mikechen
今天主要给大家介绍下9种性能优化的方法:
1.代码
之所以把代码放到第一位,是因为这一点最容易引忽视,比如拿到一个性能优化的需求以后,言必称缓存、异步等。
实际上,第一步就应该是分析相关的代码,找出相应的瓶颈,再来考虑具体的优化策略。
有一些性能问题,完全是由于代码写的不合理,通过直接修改一下代码就能解决问题的,比如for循环次数过多、作了很多无谓的条件判断、相同逻辑重复多次等,这样的优化成本是最低的。
2.数据库
1.SQL优化
这里以MySQL为例,最常见的方式是,由自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain、profile等工具来逐步调优,最后经过测试达到效果后上线。
这里举几个优化的例子:
1.查询优化
对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.避免null判断
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
3.避免全表扫描
应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描。
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
4.大数据量查询
对于多张大数据量的表JOIN,要先分页再JOIN,否则逻辑读会很高。
5.合理使用索引
索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
6.多使用数字型字段
尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
7.避免大数量
尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
8.避免大事务
尽量避免大事务操作,提高系统并发能力。
2.连接池调优
我们的应用为了实现数据库连接的高效获取、对数据库连接的限流等目的,通常会采用连接池类的方案,即每一个应用节点都管理了一个到各个数据库的连接池。
随着业务访问量或者数据量的增长,原有的连接池参数可能不能很好地满足需求,这个时候就需要结合当前使用连接池的原理、具体的连接池监控数据和当前的业务量作一个综合的判断,通过反复的几次调试得到最终的调优参数。
3.架构层面
这一类调优包括读写分离、多从库负载均衡、水平和垂直分库分表等方面,一般需要的改动较大,但是频率没有SQL调优高,而且一般需要DBA来配合参与。
3.分布式缓存
缓存可以称的上是性能优化的利器,缓存主要用来存放那些读写比很高、很少变化的数据。
什么情况适合用缓存?考虑以下两种场景:
短时间内相同数据重复查询多次且数据更新不频繁,这个时候可以选择先从缓存查询,查询不到再从数据库加载并回设到缓存的方式。此种场景较适合用单机缓存。高并发查询热点数据,后端数据库不堪重负,可以用缓存来扛。
使用缓存需要注意的问题:
1.避免缓存失效
把频繁修改的数据放入缓存,容易出现数据写入缓存后,应用还来不及读取缓存,数据就已经失效的情形,徒增系统负担。
2.缓存热点数据
缓存使用的内存资源非常宝贵,只能将最新访问的数据缓存起来,而把历史数据清理出缓存,即缓存资源应该留给20%的热点数据。
3.数据不一致性
一般会对缓存设置失效时间,超过失效时间,就要从数据库重新加载。
因此应用要忍受一定时间的数据不一致,另一种策略是数据更新时立即更新缓存,不过这也会带来更多的系统开销和事务一致性的问题。
4.缓存可用性
业务发展到一定阶段时,缓存会承担大部分数据访问的压力,数据库已经习惯了有缓存的日子,所以当缓存服务器崩溃时,数据库会因为完全不能承受如此大的压力而宕机,进而导致整个网站不可用,这种情况被称作缓存雪崩,发生这种故障,甚至不能简单地重启缓存服务器和数据库服务器来恢复网站访问。
解决方式:
1)缓存热备(当某台服务器宕机时,将缓存访问切换到热备服务器上;
2)缓存服务器集群。
5. 缓存预热
缓存中存放的是热点数据,热点数据是缓存系统用LRU对不断访问的数据筛选出来的,这个过程需要较长的时间。
新启动的缓存系统没有任何数据,此时系统的性能和数据库负载都不太好。因此可以选择在启动缓存是就把热点数据预加载好。
6.缓存穿透
因为不恰当的业务或恶意攻击,持续高并发地访问某一个不存在的数据,如果缓存不保存该数据,就会有大量的请求压力落在数据库上。
简单的解决方式是把请求的不存在的数据也放进缓存,其value是null。
4.异步化
针对某些客户端的请求,在服务端可能需要针对这些请求做一些附属的事情,这些事情其实用户并不关心或者用户不需要立即拿到这些事情的处理结果,这种情况就比较适合用异步的方式处理这些事情。
异步化的作用:
缩短接口响应时间,使用户的请求快速返回,用户体验更好。避免线程长时间处于运行状态,这样会引起服务线程池的可用线程长时间不够用,进而引起线程池任务队列长度增大,从而阻塞更多请求任务,使得更多请求得不到技术处理。线程长时间处于运行状态,可能还会引起系统Load、CPU使用率、机器整体性能下降等一系列问题,甚至引发雪崩。异步的思路可以在不增加机器数和CPU数的情况下,有效解决这个问题。
比如:使用消息队列(MQ)中间件服务,MQ天生就是异步的。
一些额外的任务,可能不需要我这个系统来处理,但是需要其他系统来处理,这个时候可以先把它封装成一个消息,扔到消息队列里面,通过消息中间件的可靠性保证把消息投递到关心它的系统,然后让这个系统来做相应的处理。
再比如C端在完成一个提单动作以后,可能需要其它端做一系列的事情,但是这些事情的结果不会立刻对C端用户产生影响,那么就可以先把C端下单的请求响应先返回给用户,返回之前往MQ中发一个消息即可,而且这些事情理应不是C端的负责范围,所以这个时候用MQ的方式,来解决这个问题最合适。
5.Web前段
Web前端指网站业务逻辑之前的部分,包括:
浏览器加载网站视图模型图片服务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请求响应速度,减轻服务器负载要。
6.服务化
做服务化最基础的是按业务做服务拆分,避免跨业务间的互相影响,数据和服务同时拆分。同一个业务内部我们还按计算密集型/IO密集型的服务拆分、C端/B端服务拆分、核心/非核心服务拆分、高频服务单独部署等原则做拆分。
7.硬件升级
硬件问题对性能的影响不容忽视。
举一个例子:一个DB集群经常有慢SQL报警,业务排查下来发现SQL都很简单,该做的索引优化也都做了,后来DBA同学帮忙定位到问题是硬件过旧导致,将机械硬盘升级成固态硬盘之后报警立马消失了,效果立竿见影!
8.搜索引擎
复杂查询以及一些聚合计算不适合在数据库中做,可以利用搜索引擎来实现,另外搜索引擎还可以帮我们很好的解决跨库、跨数据源检索的场景。
9.产品逻辑优化
业务逻辑优化经常会容易被忽略,但效果却往往比数据库性能优化、JVM调优之类的来的更明显。
举一个例子,12306春运抢火车票的场景,由于访问的人多,用户点击“查票”之后系统会非常卡,进度条非常慢,作为用户,我们会习惯性的再去点“查票”,可能会连续点个好几次。
假设平均一个用户点5次,则后端系统负载就增加了5倍!而其中80%的请求是重复请求。
这个时候我们可以通过产品逻辑的方式来优化,比如,在用户点击查询之后将“按钮置灰”,或者通过JS控制xx秒只能只能提交一次请求等,有效的拦截了80%的无效流量。
以上!
更多架构技术干货,私信【架构】即可查看我原创的300期+BAT架构技术系列文章与1000+大厂面试题答案合集。
拓展知识:
网站性能优化方案
1.网站选择的关键词要有搜索量,而且与网站内容相关。
2.网站标题最多融入2~3个关键词。
3.网站重要页面一定要静态化。
4.要学会自己来写网站的原创内容。
5.内容要保持及时更新。
6.网站内部链接要形成蜘蛛网状,相互链接。
7.多增加相关网站的反向链接。
8.不要主动链接被搜索引擎惩罚的网站。
9.不要为SEO而SEO,网站面向的是用户。
10.不要作弊,搜索引擎比你聪明。
参考资料:
http://www.itxia.com/a/201009/11638.html
网站性能优化方案
站内优化和站外推广
站内优化:设置标题关键词描述
关键词分布和密度
内联 原创文章
好的用户体验
站外推广:写博客 软文
发帖顶贴
论坛推广
等等
本回答被提问者采纳
网站性能优化方案
我觉得 友情链接 最为重要!
网站性能优化方案
网站优化思路
一、企业网站优化的基本思路和优化方案
目前,国内网站seo经过优化,竞争也越来越激烈,越来越难做。 让我们一起分析一下企业网站的SEO优化方案和技术,看看网站如何更有效地在搜索引擎上获得好的排名,引起企业网站SEO员工的关注。
1、内部优化
内部优化主要包括关键词优化、URL优化、代码优化、web布局优化、网站布局优化等主要方面的优化。
关键词优化是最基本、最重要的内部优化,让更多的用户找到合适的关键字,决定网站目标关键字是否能在搜索引擎上获得更好的排名。
网站优化思路
2、关注用户关心的问题
对企业网站来说,构建的主要目的是让用户找到所需的信息,从而产生用户开放量,提高网站的关注度。网站从构建初期开始,就在域名选择、网站布局、web风格、代码编写等方面实现了简化和清晰化。
请勿在网页中使用大量动画效果或影响打开速度的元素。 这样,用户就可以轻松打开网页,并快速找到所需的信息。
3、长尾关键词布局
关键词的选择决定了网站在搜索引擎中获得好名次的首要任务,因此对于专业的SEO研究人员来说,研究关键词是用户能够找到自己网站的重要指示灯,能够显着提高网站的接通量和名次
但是,用户的搜索习惯在不断变化,例如通过百度搜索引擎的下拉框、相关搜索、关键字规划器等工具和方法,用户使用的搜索词会受到当前社会热点、新闻时效性等的影响因此,相对于网站上的关键字不是不变的,而是随着时代的发展变化、技术的发展、人们的关注点而扩展关键字。
4,站外的优化
网站外部的优化主要指链接的优化,主要是在网站上合理添加有效的具有权重的外部链接,根据平台的不同,可以拥有链接。
外部链接在整个网站优化中占有重要地位。 现在发送外部链的地方变少了,对排名的作用也不明显了,很多人放弃了外部链。 更换友情链接目前这种方式很好,所以可以多更换友情链接。 这相当于可靠的投票。
提高排名
5、外部投稿
原始内容不仅可以发布在自己的网站上,还可以发布在本产业的权威网站上,并添加本站地址。 有些权重高的网站在通过原始内容得知并信任后,会给其网站单方面的链接,但这个过程可能需要几个月的时间。seo的总结
网站优化是一项长期工作,需要持续操作网站,并向网站添加新的内容和链。 为了取得好的名次,外链的构建必须稳定持续。 每天持续制造10条外侧链条,有助于网站后期的优化。