Web --- 缓存

Posted Nireus_LOVE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web --- 缓存相关的知识,希望对你有一定的参考价值。

1. 简介

缓存就是用来避免频繁的到主存储器(一般来说可能是数据库,结构化的磁盘文件,远程网络接口,程序接口等等提供数据返回的)获取数据而建立的一个存取更快的临时存储器(缓存)。一般来说,缓存比主存储器更小,但是存取速度非常快。
Web缓存介于服务器和客户端之间。这个服务器可能是源服务器(资源所驻留的服务器),数量可能是1个或多个;客户端也可能是1个或多个。Web缓存就在服务器-客户端之间监控请求,并且把请求输出的内容(例如html页面、 图片和文件等统称为副本)另存一份;然后,如果下一个请求是相同的URL,则直接返回保存的副本,而不是再次请求源服务器

2. 作用

缓存一般用来
1. 存储频繁访问的数据
2. 临时存储耗时的计算结果
3. 内存缓存减少磁盘IO
4. 降低延迟:缓存离客户端更近,因此,从缓存请求内容比从源服务器所用时间更少,呈现速度更快,网站就显得更灵敏。
5. 降低网络传输:副本被重复使用,大大降低了用户的带宽使用,其实也是一种变相的省钱(如果流量要付费的话),同时保证了带宽请求在一个低水平上,更容易维护了。

3. 类型

3.1 数据库端缓存

原理是以“空间换时间”。比如建一个表来存储另外一个表某个类型的数据的总条数,在每次更新数据的时候同步更新数据表和统计条数的表。在需要获取某个类型数据条数的时候,就不需要select count去查询,直接查询统计表就可以了,这样可以提高查询的速度和数据库的性能。
常见实现方法包括普通表(缓存统计数据)和内存表。

3.2 应用层缓存

比较常见的应用层分布式缓存容器:Memcache、共享文件服务器、MemcacheDb、Tokyo Tyrant。 java实现的缓存也比较多,比如oscache,jcache ,ehcached等等。

3.2.1 作用

  1. 缓存数据库的查询结果,减少数据的压力。这个在大型网站是必须做的。
  2. 缓存磁盘文件的数据。比如常用的数据可以放到内存,不用每次都去读取磁盘,特别是密集计算的程序,比如中文分词的词库。
  3. 缓存某个耗时的计算操作,比如数据统计。

3.2.2 架构

  1. 嵌入式:也就是缓存和应用在同一个机器。比如单机的文件缓存,java中用hashMap来缓存数据等等。这种缓存速度快,没有网络消耗。
  2. 分布式:把缓存的数据独立到不同的机器,通过网络来请求数据,比如常用的memcache就是这一类。
    (2.1)按应用切分数据到不同的缓存服务器,这是一种比较简单和实用的方式。
    (2.2)按照某种规则(hash,路由等等)把数据存储到不同的缓存服务器
    (2.3)代理模式,应用在获取数据的时候都由代理透明的处理,缓存机制有代理服务器来处理

3.3 前端缓存

前端缓存可以理解为一般使用的cdn技术,利用squid等做前端缓冲技术,主要还是针对静态文件类型,比如图片,css,js,html等静态文件。
前端比较常用的就是squid,Varnish Cache,ncache等等。
Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (vg.no) 使用3台Varnish代替了原来的12台squid,性能比以前更好。

3.4 客户端缓存

浏览器端的缓存,可以让用户请求一次之后,下一次不在从服务器端请求数据,直接从本地缓存读取,可以减轻服务器负担也可以加快用户的访问速度。
浏览器会在你的硬盘上专门开辟一个空间为你存储资源副本。浏览器缓存的工作规则很简单:检查以确保副本是最新的,通常只要一次会话(就是当前浏览器调用的这次)。
浏览器缓存在用户触发“后退”操作或点击一个之前看过的链接的时候很管用。同样,如果你在网站上访问同一张图片,该图片可以从浏览器缓存中调出并几乎立即显现出来。

4. 更新和过期

对于应用层的缓存,由于经常有新的数据加入,数据的修改,数据的删除等等操作,而在某些时间,我们需要这些操作及时的生效(由于用了缓存,可能会导致修改后缓存没有更新,而页面也没有变化),所以出现缓存的更新和过期的概念。

4.1 缓存过期

  1. 时间过期
    在缓存数据的时候我们可以指定数据缓存的最大时间,如果超过这个时间,我们就认为缓存是失效的。
  2. 基于规则的过期
    在缓存中存储了某些数据来标明数据的版本。比如存取的时间,更新的时间,数据的版本信息等等。然后比较这些信息是否有变化来判断是否过期。

4.2 缓存更新

  1. 被动
    当缓存失效的时候,应用程序重新从主存储器中取数据,然后重新放回缓存中。
  2. 主动
    当数据更新的时候,应用程序主动的去更新缓存内容。
  3. 被动和主动结合(基于版本)
    当数据更新的时候,我们更新一个数据被更新的标志。然后根据上面讲到的“基于规则的过期”来更新数据。

5. 缓存评价指标

5. 1 速度

当然,我们使用缓存的目的之一就是要提高我们应用的速度。如果使用缓存后速度更慢那就没有缓存的必要了。取缓存的速度应 当是非常快的,因为缓存的工作仅仅是取出一个曾经存储好的数据。所以影响缓存速度的因素可能跟缓存所才采用的存储方式有关系,还有可能印象速度的就是分布 式缓存的网络消耗,同样,缓存服务器在并发很大的时候也有可能不堪重负出现瓶颈,变得缓慢。
比如目前凤凰论坛使用的帖子缓存的响应时间在亚毫秒级,也就是还不足1ms的响应时间,这个速度是相当快的。

5.2 及时性

我们使用缓存的重要一点就是对我们的数据的更新需要缓存也及时的更新。这点非常重要,关系到页面显示的正确性,用户体验等。

5.3 命中率

命中率直接关系到缓存所起到的作用的大小。如果命中率太低就相当于没有使用缓存,或者我们的缓存的规则有问题,重视命中不到缓存。

6. 参考

http://www.cnblogs.com/sunli/archive/2009/11/24/1609444.html
http://www.kuqin.com/web/20130616/334590.html

以上是关于Web --- 缓存的主要内容,如果未能解决你的问题,请参考以下文章

深入System.Web.Caching命名空间 教你Hold住缓存管理

采用什么样的策略和方法来实现系统缓存?

如何搭建一个React Native热更新平台

ExtJs 4:如何在一个请求中发送所有修改、新和删除的记录?

iOS web缓存策略以及手动清除缓存

键盘用的手感不一样 跟新和旧有啥关系?