`
sailorls
  • 浏览: 59035 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多

 

一、缓存简介

1.什么是缓存

维基百科上的定义: 凡是位于速度相差较大的两种硬件之间的,用于协调两者数据传输速度差异的结构,均可称之为Cache

生成高性能、可缩放的 Web 应用程序最重要的因素之一是能够在首次请求项时将这些项存储在内存中,不管它们是数据对象、页还是页的某些部分。 可以将这些项缓存或存储在 Web 服务器上或请求流中的其他软件上,如代理服务器或浏览器。 使您能够避免重新创建满足先前请求的信息,尤其是那些需要大量处理器时间或资源的信息。

2.缓存分类

       从本质上来讲,缓存分为输出缓存和应用程序数据缓存。输出缓存是将生成的页面、图片、JS文件等保存在本地或内存,当请求的时候将本地或内存中的输出返回。实现原理一般是通过http响应头中的Cache设置,可以在程序中实现对http响应头的修改。应用程序缓存是将数据存放在内存的Cache容器中,读取时先从内存中读取,从而提高数据访问的效率。

缓存

分类

用途

应用程序数据缓存

数据缓存

减少对数据库的请求

Web服务器缓存

输出缓存

减少应用服务器的请求

客户端浏览器缓存

输出缓存

减少对网站的请求

 

2.1输出缓存(客户端浏览器的缓存)

一般而言,在Web服务器中可以进行输出缓存的设置,并且默认会对静态的js、图片等设置响应缓存。设置后,web服务器在返回的http响应头中设置缓存失效时间,例如“Expires Fri Nov 12 2010 12:04:48 GMT+0800”。这样,在发出请求的浏览器、响应请求的 Web 服务器以及请求或响应流中任何其他具有缓存功能的设备(如代理服务器)上都可以缓存页。

浏览器接收到http响应后,根据响应头中的缓存设置进行缓存缓存后,同一台机器发出的请求在缓存失效前就会直接使用本地的缓存,不会再向服务器进行请求。

比如,使用firebug可以查看到http应答头中的缓存失效时间。

<!--[endif]-->

 

2.2输出缓存(位于Web服务器之前的缓存服务层)

       这个层面的缓存旨在通过Web服务器前的缓存服务器,通常是反向代理服务器,比如Squid,或其他Web加速设备,比如F5

       工作原理:用户在访问Web应用时先经过缓存服务器,一般都是反向代理服务器或其他流量分发设备,在此服务器上缓存图片、JS文件、Html等,如果有缓存,则直接返回给用户结果,无需将请求再发给Web服务器,从而有效的减轻了Web服务器的负载。也叫Web加速技术。   

 

<!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75" alt="1123213" style='width:300pt;height:129.75pt'> <v:imagedata src="file:///C:\DOCUME~1\zoe\LOCALS~1\Temp\msohtmlclip1\01\clip_image003.gif" o:href="http://www.chentaoqian.com/wp-content/uploads/2009/07/1123213.gif" /> </v:shape><![endif]--><!--[if !vml]-->1123213<!--[endif]-->

代理服务器缓存后,客户端发过来的相同的请求就会直接使用在代理服务器上的缓存,而不会再向Web服务器请求。

当前一些设备,比如F5Web加速技术,也可以对部分动态的页面进行缓存。

       此部分不是本文档讨论的重点,详细用SquidWeb加速可参考相关资料如

http://www.opent.cn/a/106/2564.shtml

http://www.chentaoqian.com/archives/408

2.3输出缓存(动态语言的Web容器层)

使用输出缓存,你可以缓存最后输出的HTML页面,当相同的页面再次请求的时候,缓存功能允许利用缓存满足对页的后续请求,这样就不需要再次运行最初创建该页的代码。 对站点中访问最频繁的页进行缓存可以充分地提高 Web 服务器的吞吐量(通常以每秒的请求数计算)。

<!--[if !supportLists]-->l   <!--[endif]-->缓存页面

       用户请求某一缓存页时,Web服务器根据已经为该页定义的缓存策略确定其缓存输出是否仍有效。 如果该输出有效,则将该缓存输出发送到客户端,并且不重新处理该页。

       对于此种方式,ASP.netJava都有对应的实现,相比之下,ASP.net可以直接在aspx页面上配置实现,也可以在程序中控制,相当简单。Java解决方案中,很多缓存框架提供同样的服务,OSCache也提供标签的方式设置页面输出缓存,但OSCache项目从2007年后没有更新,不建议使用。EHCache也可以实现页面输出缓存,但过程没有OSCache简洁。

       多数缓存方案也支持缓存同一页中的多个版本,比如,根据初始请求 (HTTP GET) 中的查询字符串,回发时传递的控制值(HTTP POST 值),随请求传递的 HTTP 标头,发出请求的浏览器的主版本号等因素存储不同的缓存版本,根据不同的请求返回不同的缓存版本。

      

<!--[if !supportLists]-->l   <!--[endif]-->缓存部分页面

       有时缓存整个页是不现实的,因为页的某些部分可能在每次请求时都需要更改。 在这些情况下,只能缓存页的一部分。比如,对某些控件进行缓存。

2.4应用程序数据缓存(应用程序数据访问层)

应用程序缓存是将数据存放在内存的Cache容器中,读取时先从内存中读取,从而提高数据访问的效率。

!vml]-->ASP.NET缓存机制简析(图二)

关于数据的更新与缓存的失效

有的缓存框架与数据库绑定提供了通知机制,比如说ASP.net的缓存框架和Sql Server绑定,当Sql Server数据库变动时,会自动通知缓存更新数据。但这种解决方案目前还只能和Sql Server绑定,并且似乎会在数据表上自动增加trigger

比较常见的数据更新方式是在程序中控制,比如在数据变更时通知对应缓存清除数据,可以在更新数据时就写入新数据到缓存或者只是清除,等用户读取数据时再写入缓存。推荐采用后一种方式。

比较好的处理方式推荐用AOP,对数据变更的方法织入清除缓存的代码,将缓存清除。这样可以将清除缓存和代码的业务逻辑切割开来。

3.集群与分布式缓存

对于数据的缓存在应用服务器集群时会遇到脏数据的问题。因为数据的改变的通知只能通知到本地的缓存,在其他机器上的缓存则继续使用着本地缓存中错误的数据。

解决这一问题的方法可以使用独立的缓存服务器,比如MemCache,当多台集群都使用同一缓存服务器,则不存在更新数据的问题。这也用来解决不同进程间需要使用共同的缓存数据的问题。

进一步,我们涉及到缓存服务器集群的问题。当缓存数据量大到单机资源无法承受的时候,需要进行缓存服务器集群。传统缓存服务器集群采用数据复制的技术,当集群变大的时候效率相当成问题。MemCache的高明之处在于,MemCache集群的节点之间没有任何通信,它在客户端连接中实现一个算法,将存储对象在各节点中做一个分配。从而实现了memcache的集群。

<!--[endif]-->

二、ASP.NET缓存介绍

可参考msdn文档:ASP.NET 缓存

http://msdn.microsoft.com/zh-cn/library/xsbfdd8c.aspx

以及

PetshopAsp.net缓存

http://www.shehui001.com/htm/2009810/198.htm

 

三、EHCache介绍

EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider

下图是 Ehcache 在应用程序中的位置:

主要的特性有:

1. 快速.
2.
简单.
3.
多种缓存策略
4.
缓存数据有两级:内存和磁盘,因此无需担心容量问题
5.
缓存数据会在虚拟机重启的过程中写入磁盘
6.
可以通过RMI、可插入API等方式进行分布式缓存
7.
具有缓存和缓存管理器的侦听接口
8.
支持多缓存管理器实例,以及一个实例的多个缓存区域
9.
提供Hibernate的缓存实现
10.
等等

详细可参考EHCache官方网站提供的EHCacheUserGuide http://ehcache.org

四、OSCache介绍

OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是个一个广泛采用的高性能的J2EE缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。

支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。

       但遗憾的是,OSCache官方网站上的项目自从2007年开始停止了更新,从后继发展的角度来说,Java的本地缓存框架应选择EHCache

五、MemCache介绍

memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为 豆瓣、Facebook Vox 等众多服务中提高Web应用扩展性的重要因素。

memcached作为高速运行的分布式缓存服务器,具有以下的特点。

 

•协议简单

•基于libevent的事件处理

•内置内存存储方式

memcached不互相通信的分布式

 

<!--[if !supportLists]-->l   <!--[endif]-->协议简单

memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。下面是例子:

 

$ telnet localhost 11211

Trying 127.0.0.1...

Connected to localhost.localdomain (127.0.0.1).

Escape character is '^]'.

set foo 0 0 3     (保存命令)

bar               (数据)

STORED            (结果)

get foo           (取得命令)

VALUE foo 0 3     (数据)

bar               (数据)协议文档位于memcached的源代码内,也可以参考以下的URL

 

http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt基于libevent的事件处理

libevent是个程序库,它将LinuxepollBSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在LinuxBSDSolaris等操作系统上发挥其高性能。关于事件处理这里就不再详细介绍,可以参考Dan KegelThe C10K Problem

 

libevent: http://www.monkey.org/~provos/libevent/

The C10K Problem: http://www.kegel.com/c10k.html

<!--[if !supportLists]-->l   <!--[endif]-->内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。关于内存存储的详细信息,本连载的第二讲以后前坂会进行介绍,请届时参考。

 

<!--[if !supportLists]-->l   <!--[endif]-->memcached不互相通信的分布式

memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。它在客户端连接中实现一个算法,将存储对象在各节点中做一个分配。从而实现了memcache的集群。

详细介绍可参考 memcached完全剖析系列教程

http://www.plhwin.com/memcached-tutorial-base-1/

 

0
7
分享到:
评论

相关推荐

    ASP.NET3.5揭秘(卷2)part1

     4.1 缓存概览  4.2 使用页面输出缓存  4.3 使用部分页面缓存  4.4 使用数据源缓存  4.5 使用数据缓存  4.6 使用SQL缓存依赖  4.7 小结  第5章 多语言本地化应用程序  5.1 设置当前文化  5.2 ...

    ASP.NET 3.5 揭秘(卷2).part2

     4.1 缓存概览  4.2 使用页面输出缓存  4.3 使用部分页面缓存  4.4 使用数据源缓存  4.5 使用数据缓存  4.6 使用SQL缓存依赖  4.7 小结  第5章 多语言本地化应用程序  5.1 设置当前文化  5.2 ...

    ArcGIS 10新特性概览.pdf

    ArcGISServer 系统更新 •安装改进 •管理加强 •地图缓存改进 •服务改进 ArcGISServer 应用更新 •Java & .netWeb ADF •Flex,Silverlight,Javascript ArcGIS 10新特性概览.pdf

    18个运维必知的Nginx代理缓存配置技巧(你都掌握了哪些呢)

    概览 内容缓存位于客户端和源服务器 (upstream) 之间,并保存它看到的所有内容的副本。如果客户端请求缓存已存储的内容,则它会直接返回内容而不连接源服务器。这提高了性能,因为内容缓存更靠近客户端,并且更

    基于Spring Boot 1.5开发的智能运维管理系统,适合百台规模以下机器的部署运维(源码+数据库),发布、降级、缓存管理等

    框架概览 主框架:spring boot 权限控制:spring security ORM框架:spring data jpa 操作日志回显:websocket 前后端分离:angularjs+bootstrap 系统部署 多角色配置,不同角色区分环境和菜单权限。不同环境可以做...

    HP AlphaServer DS25系统技术概览

    每处理器的二级高速缓存为8MB。基于交换机的系统互连能够充分发掘Alph。芯片的潜能。该系统提供有基座式或机架安装式两种。这两种系统中的组件相同机架安装式系统只是旋转到了侧面。机架安装式系统需要5U空间可与...

    wanderlust:Wanderlust,渴望通过 Google Analytics、Piwik、REST 端点、sitemap.xml 和其他来源来预热您网站的缓存

    流浪癖 - WIP 具有优先级的缓存预热/引物 ...架构概览 想法: : 建造 安装 $ go get -u github.com/constabulary/gb/... $ git clone --recursive git@github.com:SchumacherFM/wanderlust.git $ gb bui

    ASP.NET.4揭秘 卷2

    n11 Login控件概览 n12 使用Login控件 n121 自动重定向用户到来源页面 n122 自动隐藏已验证用户的Login控件 n123 使用模板定制Login控件 n124 使Login控件执行自定义身份验证 n13 使用CreateUserWizard控件 n131 ...

    Oracle9i 数据库管理基础

    基本组件概览1-3 Oracle 服务器1-5 Oracle 例程1-6 建立连接和创建会话1-7 Oracle 数据库1-9 物理结构1-10 内存结构1-11 系统全局区1-12 共享池1-15 库高速缓存1-16 数据字典高速缓存1-17 数据库缓冲区高速缓存1-18 ...

    QuoBikeIs:您最喜欢的 PubliBike 位置的快速概览

    您最喜欢的 PubliBike 位置的快速概览。 LIVE : : TEST : : 报价的非官方网站。 Christian Studer 的网站( ,)。 (以前托管在wohetsno.bike 。这很有趣,但不想再付钱了。) 结构体 简单的 React 应用...

    svg-explorer-extension:Windows资源管理器的扩展模块,用于呈现SVG缩略图,以便您可以概览SVG文件

    Windows资源管理器的扩展模块,用于呈现SVG缩略图,以便您可以概览SVG文件。 安装 从下载并为您的系统运行适当的二进制文件。 安装后无需采取任何其他措施。 确保下载正确的体系结构(32位安装程序将在64位系统上...

    Cola-Designer拖拽式网站设计器

    概览 部分截图: 注意事项:项目默认使用接口模式,完整功能需要连接后端程序,若只想体验设计器部分可将env.js中active改为preview(本地缓存模式),然后访问http://localhost:8009/#/design ,本地缓存模式暂时不...

    Apache Flume-Hadoop分布式日志收集_第二版

    本书通过Flume的架构概览与快速起步指南帮助你迅速掌握Flume。深入介绍Flume众多更加有用的组件的细节信息,包括用于即时数据记录持久化的重要的文件通道、用于缓存并将数据写到HDFS中的HDFS接收器,以及Hadoop...

    Operations-dashboard:Digital Land中运行了GitHub工作流的快速概览

    操作仪表板 GitHub上的Digital Land组织的快速概述,包括工作流运行结果。 要求 (与Node捆绑在一起) 对数字土地存储库具有...要更新缓存的结果,请运行DLB_BOT_TOKEN=YourAccessToken npm run fetch以从GitHub API

    数据管理平台 Apache Geode.zip

    概览Apache Geode 是一个数据管理平台,提供实时的、一致的、贯穿整个云架构地访问数据关键型应用.Geode 池化了服务器上的内存, CPU, 网络资源, 和本地磁盘,跨多个进程来管理应用对象和应用行为. 它使用了动态数据...

    django-docs-2.2-zh-hans.zip

    缓存 日志 发送邮件 资讯聚合 (RSS/Atom) 分页 消息框架 序列化 会话 站点地图 静态文件管理 数据验证 其它核心功能 了解更多 Django 框架的其他核心功能 : 有条件的内容处理 内容类型和通用关系 简单页面 重定向 ...

    serverdashboard:包含服务器概览的仪表板

    还包括一个简单的缓存功能,以防止系统负载过高,可在简单配置中进行配置。 JSON 将用于在仪表板和 PHP 脚本之间传输数据。 或者,您可以允许使用 AJAX 从其他域到简单的 json-API 进行外部访问 - 只需将配置变量...

    Pear Admin Pro 开 箱 即 用 的 Spring Boot 企 业 级 开 发 平 台

    缓存监控: 对系统的缓存查询,删除、清空等操作。 在线用户: 用户在线列表,用于系统在线用户监控。 通知公告: 系统通知公告信息发布维护。 定时任务: 在线(添加、修改、删除)任务调度包含执行结果日志。 表单...

    oracle10g课堂练习II(1)

    练习概览:恢复丢失的 TEMPFILE 和重做日志文件 4-19 5 数据库恢复 课程目标 5-2 恢复方法 5-3 用户管理的恢复: RECOVER 命令 5-4 RMAN 恢复: RESTORE 和 RECOVER 命令 5-5 使用 Oracle Enterprise ...

Global site tag (gtag.js) - Google Analytics