Posted by:
努力记

努力记,通过记录,计划,让自己的努力可以触碰彩虹!

5,131

网站:缓存

  • 2013-04-30
  • 暂无评论

对于web网站来说,缓存是网站性能的关键

但缓存的概念涉及到网站建设的方方面面,不是说要缓存就能缓存的。

通常网站缓存可以分为3个级别: File(文件:请求级别)、page(页面:访问级别)、data(数据:调用级别)

缓存也可以按实现方式分为:客户端,服务端

File:静态文件,这里的并不是指在服务器上生成静态页面或固定的数据文件(不应该进行数据文件的缓存,文件的存储是被路径所限制的,在服务器扩展中会成为障碍)

静态文件:图片,JS等

这类的文件改动的可能性相对较小,缓存是为了加速读取。

缓存方式有2种:浏览器缓存(客户端),web加速服务器(服务端),这2种方式都是在web服务器上进行设置。

  1. 浏览器缓存:通过在web服务器上设置对这类的静态文件发送header头Expires(过期时间):该属性会让浏览器在过期时间之前不再次向服务器发出请求,除非客户端清除浏览器缓存或强制更新该文件,减少了请求数。
  2. Web加速服务器:有3种方式
    1. 发送header头Last-Modified(最后修改时间):该属性会让浏览器再次访问时询问服务器时向服务器发送If-Modified-Since(如果此后修改),服务器通过判断,如果资源在服务器端没有被修改,则会自动返回HTTP 304(Not Changed),减少了数据传输。
    2. 发送header头Etag(被请求变量的实体值):与Last-Modified,再次请求时浏览器会发送If-None-Match(如果不匹对),如果资源在服务器端没有被修改,则会自动返回HTTP 304,该属性是个更加严格的匹对标准(1秒内修改了多次),通常会与Last-Modified同时使用,减少数据传输
    3. 反向代理:通过在将请求的静态文件缓存在内存中,在请求时直接从内存中进行返回,来加快资源的读取,减少读取磁盘

对于静态文件的缓存算是http优化,是和代码无关的优化操作,相对容易实现

相对的缓存策略也比较单一(可以进行优化分析,但基本结构如下):

浏览器判断->服务器对浏览器信息的判断->服务器自身判断->更新

浏览器判断及服务器对浏览器信息的判断通常都是建立在HTTP协议的基础上进行优化,服务器自身判断是通过是内部的缓存策略和缓存算法。

Page和data都是服务端的缓存,与网站的业务、服务器负载、代码结构有关,实现方式一致,通过将数据或页面内容存入缓存服务器(统一实现,简化内部,在代码层面实现统一缓存),在需要时先判断缓存服务器内是否有该信息的缓存,减少页面计算(数据:减少数据调用),缓存服务器一般都是通过内存缓存保证性能,通常意义上只需要扩展内存就能提高网站的负载

Page:一次访问产生一个页面,对该页面的缓存根据页面的业务性质分为部分页面缓存和全部页面缓存

Data:一个页面的组成,需要各种不同的数据,数据的来源也是通过一次请求进行调用(可能是外部,也可能是内部),数据的缓存主要是针对需计算的数据请求,如:单次数据库查询,多次数据库查询后合并的数据

在设计内部缓存结构时,主要是对page和data的缓存实现对服务器性能的优化,同时避免因黑盒缓存所导致的用户访问数据不一致(程序逻辑问题),需要对缓存策略进行分析,根据不同的环境设定策略,简化开发中的缓存实现

考量缓存优化的重要指标:缓存命中,缓存的命中率越高,说明缓存的实现越好

但无意义的缓存和不加限制的缓存时间设定无疑没有起到缓存的目的,由此而产生的缓存命中率没有任何意义,所以在涉及缓存策略的初期是不应去考虑命中率,应根据具体需求建立合适的缓存策略,日后在缓存策略的基础上通过命中率指标进行具体策略参数的优化,所以缓存策略是缓存的关键。

在分析缓存策略中不区分page和data,全部都当成数据进行分析

缓存的复杂度在于以下几个场景:

  1. 非共性数据(同类数据不同特性:使用率)
  2. 并发及分布式
  3. 量化缓存持久性(准确预估每份展示数据的缓存时间)

对于不同的环境和业务需求都有不同的缓存策略:

  1. 主动存储,数据被更新则清除缓存
  2. 被动存储,设定缓存时间
  3. 自动存储,服务器轮询更新缓存,前端永久性读取缓存信息(首页,索引)
  4. 同类的非共性数据,根据实际使用率,在策略中设置参数,区别缓存(活跃度)
  5. 第三方实现物理存储(并发及分布式)

注:

  1. 对同一份数据不应该涉及到多个缓存策略(能避免则避免,容易产生缓存的不确定,为了缓存而增加程序复杂度)
  2. 如果一份数据涉及到缓存策略,则所有对该数据的读取都应该读取该缓存

缓存的另一个关键是缓存算法,分布式缓存还需要涉及到分布式算法,目前使用memcache,内置的存储算法,及因为其环境结构实现的分布式算法能很好的简化中小企业在这类问题上的处理(FaceBook使用了上千台memcache的服务器,如果缓存算法和分布式算法不满意,只需要单独的进行优化,不会对程序结构产生问题)



back up ↑

无觅相关文章插件,快速提升流量