狠狠撸

狠狠撸Share a Scribd company logo
缓存技术浅谈 Robbin Fan
缓存是什么,解决什么问题? Cache 是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问 凡是位于速度相差较大的两种硬件 / 软件之间的,用于协调两者数据传输速度差异的结构,均可称之为  Cache
基于 Web 应用的系统架构图 数据库 应用服务器 Web 服务器 存储设备 浏览器 Web 应用架构 操作系统的文件系统
Web 应用系统存在哪些速度差异? 读取文件系统  ?   读取磁盘 读取数据库内存  ?   读取文件系统  读取应用内存  ?   访问数据库服务器 读取静态文件  ?   访问应用服务器 读取浏览器缓存  ?   访问网站
缓存技术分类 操作系统磁盘缓存  ?  减少磁盘机械操作 数据库缓存  ?  减少文件系统 I/O 应用程序缓存  ?  减少对数据库的查询  Web 服务器缓存  ?  减少应用服务器请求 客户端浏览器缓存  ?  减少对网站的访问
操作系统缓存概述 文件系统提供的 Disk Cache :操作系统会把经常访问到的文件内容放入到内存当中,由文件系统来管理 当应用程序通过文件系统访问磁盘文件的时候,操作系统从 Disk Cache 当中读取文件内容,加速了文件读取速度 Disk Cache 由操作系统来自动管理,一般不用人工干预,但应当保证物理内存充足,以便于操作系统可以使用尽量多的内存充当 Disk Cache ,加速文件读取速度 特殊的应用程序对文件系统 Disk Cache 有很高的要求,会绕开文件系统 Disk Cache ,直接访问磁盘分区,自己实现 Disk Cache 策略 Oracle 的 raw device( 裸设备 ) –  直接抛弃文件系统 MySQL 的 InnoDB :  innodb_flush_method = O_DIRECT
Windows 的 Disk Cache
Linux 的 Disk Cache
数据库缓存的重要性 为什么数据库非常依赖缓存? 数据库通常是公司应用系统最核心的部分 数据库保存的数据量通常非常庞大 数据库查询操作通常很频繁,有时还很复杂 以上原因造成数据库查询会引起非常频繁的磁盘 I/O 读取操作,迫使 CPU 挂起等待,数据库性能极度低下 数据库有哪些缓存策略? Query Cache Data Buffer
Query Cache 以 SQL 作为 key 值缓存查询结果集 一旦查询涉及的表记录被修改,缓存就会被自动删除 设置合适的 Query Cache 会极大提高数据库性能 Query Cache 并非越大越好,过大的 Qquery Cache 会浪费内存。 MySQL: query_cache_size= 128M
MySQL Query Cache 监控工具 show status like 'Qcache%'; mysqlreport 脚本 MySQL Administrator
Query Cache 状态示例 __ Query Cache ______________________________________________ Memory usage  25.77M of  64.00M  %Used:  40.26 Block Fragmnt  24.73% Hits  6.98M  3.2/s Inserts  100.87M  46.9/s Insrt:Prune  34.15:1  45.5/s Hit:Insert  0.07:1
Data Buffer data buffer 是数据库数据在内存中的容器 data buffer 的命中率直接决定了数据库的性能 data buffer 越大越好,多多益善 MySQL 的 InnoDB buffer : innodb_buffer_pool_size = 2G MySQL 建议 buffer pool 开大到服务器物理内存 60-80%
MySQL buffer  监控工具 show innodb status\G show status like 'innodb%'; mysqlreport 脚本 innotop
InnoDB buffer 状态示例 __ InnoDB Buffer Pool ______________________________________ Usage  1000.00 of 1000.00  %Used: 100.00 Read hit  99.99% Pages Free  0  %Total:  0.00 Data  59.69k  93.26 % Drty:  0.02 Misc  4311  6.74 Latched  0  0.00 Reads  60.30G  28.0k/s From file  7.01M  3.3/s  0.01 Ahead Rnd  98684  0.0/s Ahead Sql  9548  0.0/s Writes  86.79M  40.3/s Flushes  14.08M  6.5/s Wait Free  0  0/s
应用程序缓存概述 对象缓存 查询缓存 页面缓存 动态页面静态化 Servlet 缓存 页面内部缓存
对象缓存 由 O/R Mapping 框架例如 Hibernate 提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程,是最省事的缓存策略 当软件结构按照 O/R Mapping 框架的要求进行针对性设计,使用对象缓存将会极大降低 Web 系统对于数据库的访问请求 良好的设计数据库结构和利用对象缓存,能够提供极高的性能,对象缓存适合 OLTP (联机事务处理)应用
对象缓存分类 对映射数据库表记录的 entity 对象进行缓存 对 1 对 n 关系的集合进行缓存 对 n 对 1 关系的关联对象进行缓存
Hibernate 对象缓存配置 @Entity  @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)  public class Forest { ... }  配置 entity 对象缓存 配置关联集合的缓存 @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)  @JoinColumn(name=&quot;CUST_ID&quot;)  @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)  public SortedSet<Ticket> getTickets() { return tickets; }  仅仅添加 Annotation 就可以了,无须编码,即可自动享受对象缓存。 Hibernate 会拦截对象的 CRUD 操作,针对对象读取操作进行缓存,针对对象修改操作自动清理缓存
Hibernate 二级缓存是提升 web 应用性能的法宝 OLTP 类型的 web 应用,由于应用服务器端可以进行群集水平扩展,最终的系统瓶颈总是逃不开数据库访问; 哪个框架能够最大限度减少数据库访问,降低数据库访问压力,哪个框架提供的性能就更高; 针对数据库的缓存策略: 对象缓存:细颗粒度,针对表的记录级别,透明化访问,在不改变程序代码的情况下可以极大提升 web 应用的性能。对象缓存是 ORM 的制胜法宝。 对象缓存的优劣取决于框架实现的水平, Hibernate 是目前已知对象缓存最强大的开源 ORM 查询缓存:粗颗粒度,针对查询结果集,应用于数据实时化要求不高的场合
查询缓存 对数据库查询结果集进行缓存,类似数据库的 Query Cache 适用于一些耗时,但是时效性要求比较低的场景。查询缓存和对象缓存适用的场景不一样,是互为补充的 当查询结果集涉及的表记录被修改以后,需要注意清理缓存
Hibernate 查询缓存 在配置文件中打开 Query Cache hibernate.cache.use_query_cache true  在查询的时候显式编码使用 Cache List blogs = sess.createQuery(&quot;from Blog blog where blog.blogger = :blogger&quot;) .setEntity(&quot;blogger&quot;,blogger) . setMaxResults(15) . setCacheable(true) . setCacheRegion(&quot;frontpages&quot;) . list();
Hibernate 查询缓存特征 并非缓存整个查询结果集,而是缓存查询结果集 entity 对象的 id 集合 [blogId1, blogId2, blogId3,…] 在遍历结果集的时候,再按照 blogId 去查询 blog 对象,例如  select blog.* from blog where id=? 如果此时 blog 配置了对象缓存,则自动读取对象缓存 Hibernate 查询缓存会自动清理过期缓存 一旦结果集涉及的 entity 被修改,查询缓存就被自动清理
页面缓存 页面缓存的作用是什么? 针对页面的缓存技术不但可以减轻数据库服务器压力,还可以减轻应用服务器压力 好的页面缓存可以极大提高页面渲染速度 页面缓存的难点在于如何清理过期的缓存 页面缓存技术有哪些? 动态页面静态化 Servlet 缓存 页面局部缓存
动态页面静态化 利用模板技术将访问过一次的动态页面生成静态 html ,同时修改页面链接,下一次请求直接访问静态链接页面 动态页面静态化技术的广泛应用于互联网 CMS/ 新闻类 Web 应用,但也有 BBS 应用使用该技术,例如 Discuz! 无法进行权限验证,无法显示个性化信息 可以使用 AJAX 请求弥补动态页面静态化的某些缺点
Servlet 缓存 针对 URL 访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布 可以进行权限的检查 OScache 提供了简单的 Servlet 缓存 ( 通过 web.xml 中的配置 ) 也可以自己编程实现 Servlet 缓存
OSCache Servlet 缓存示例 <filter> <filter-name>CacheFilter</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> <init-param> <param-name>time</param-name> <param-value>600</param-value> </init-param> <init-param> <param-name>scope</param-name> <param-value>session</param-value> </init-param> </filter> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>/news/*</url-pattern> </filter-mapping>
页面局部缓存 针对动态页面的局部片断内容进行缓存,适用于一些个性化但不经常更新的页面 ( 例如博客 ) OSCache 提供了简单的页面缓存 可以自行扩展 JSP Tag 实现页面局部缓存
OSCache 的页面局部缓存 <%@ taglib uri=&quot;http://www.opensymphony.com/oscache&quot; prefix=&quot;cache&quot; %>  <cache:cache> ... some jsp content ... </cache:cache> <cache:cache key=&quot;foobar&quot; scope=&quot;session&quot;> ... some jsp content ... </cache:cache> <cache:cache key=&quot;<%= product.getId() %>&quot; time=&quot;1800&quot; refresh=&quot;<%= needRefresh %>&quot;> ... some jsp content ... </cache:cache> <cache:cache key=&quot;<%= product.getId() %>&quot; cron=&quot;0 2 * * *&quot; refresh=&quot;<%= needRefresh %>&quot;> ... some jsp content ... </cache:cache>
应用缓存的缓存服务器 EHCache 适合充当对象缓存和 Hibernate 集成效果很好, Gavin King 也是 EHCache 作者之一 OSCache 充当 Servlet 和页面缓存 在一个 Web 应用当中可以同时使用 OSCache 和 EHCache JBossCache 在 Java 群集环境下使用 支持缓存在节点之间的复制,在 JBoss AS 上被用来实现 HTTP Session 的内存复制功能
非 Java 实现的通用缓存产物 Memcached 在大规模互联网应用下使用 每秒支撑 1.5 万~ 2 万次请求 Tokyo Tyrant  兼容 memcached 协议,可以持久化存储 支持故障切换,对缓存服务器有高可靠性要求可以使用 每秒支撑 0.5 万~ 0.8 万次请求
Web 服务器端缓存技术 基于代理服务器模式的 Web 服务器端缓存 squid/nginx Web 服务器缓存技术被用来实现 CDN (内容分发网络  content delivery network ) 被国内主流门户网站大量采用 不需要编程,但仅限于新闻发布类网站,页面实时性要求不高
基于 AJAX 技术的浏览器缓存 使用 AJAX 调用的时候,将数据库在浏览器端缓存 只要不离开当前页面,不刷新当前页面,就可以直接读取缓存数据 只适用于使用 AJAX 技术的页面
未使用 AJAX 缓存代码 1. <script src=/slideshow/ss-5275090/5275090/&quot;jQuery.js&quot;></script>  2.  <script language=&quot;JavaScript&quot;>  3.  <!--  4.  function gopage(option,obj){  5.  var page = $(&quot;#page&quot;).html() * 1;  6.  obj.disabled = true;  7.  if(option == '+'){  8.  page ++ ;  9.  var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random();  10.  // 获取 ajax url ,后面的 random 是为了防止浏览器缓存 xml 内容  11.  }else{  12.  page --;  13.  if(page < 1)page =1;  14.  var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random();  15.  16.  }  17.  $(&quot;#data&quot;).html(&quot;loading...&quot;);// 设置 loading 状态  18.  $(&quot;#page&quot;).html(page);  19. // 下面是 ajax 处理  20.  $(&quot;#data&quot;).load(url,  21.  {limit: 25},  22.  function() { obj.disabled = false; }  23.  );  24.  25.  }  26.  //-->  27.  </script>  28. <input value=&quot;<&quot; onclick=&quot;gopage('-',this)&quot; type=&quot;button&quot;>  29. <input value=&quot;>&quot; onclick=&quot;gopage('+',this)&quot; type=&quot;button&quot;>  30.  page:<span id=&quot;page&quot;>1</span>  31. <div style=&quot;border: 2px solid red; padding: 2px;&quot; id=&quot;data&quot;>data area</div>
使用 AJAX 缓存代码 # <script language=&quot;JavaScript&quot;>  #  <!--  # var cache_data = new Array();// 定义全局变量用来保存缓存数据  #  function gopageCache(option,obj){  #  var page = $(&quot;#page2&quot;).html() * 1;  #  if(option == '+'){  #  page ++ ;  #  var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random();  #  }else{  #  page --;  #  if(page < 1)page =1;  #  var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random();  #  #  }  # /* 下面是缓存增加的部分 */  #  if( (cache_data[page] !=null) && (cache_data[page].length > 1) ) {  # // 如果缓存存在 , 则直接调用缓存数据 , 不用再去服务器进行数据请求  #  alert('cache hit');  #  $(&quot;#data2&quot;).html(cache_data[page]);  #  $(&quot;#page2&quot;).html(page);  #  return true;  #  }  #  $(&quot;#page2&quot;).html(page);  #  obj.disabled = true;  #  $(&quot;#data2&quot;).html(&quot;loading(cache enabled)...&quot;);  #  $(&quot;#data2&quot;).load(url,  #  {limit: 25},  #  function(responseText) { obj.disabled = false;  #  cache_data[page] = responseText;// 将当前的数据存入到内存 ( 缓存变量 ) 中  }  #  );  #  #  }  #  #  //-->  #  </script>  # <input value=&quot;<&quot; onclick=&quot;gopageCache('-',this)&quot; type=&quot;button&quot;>  # <input value=&quot;>&quot; onclick=&quot;gopageCache('+',this)&quot; type=&quot;button&quot;>  #  page:<span id=&quot;page2&quot;>1</span>  # <div style=&quot;border: 2px solid red; padding: 2px;&quot; id=&quot;data2&quot;>data area</div>
基于 HTTP 协议的资源缓存 Etag  &quot;12523074“ Last-Modified  Thu, 29 May 2008 09:43:46 GMT /blog /blog If-Modified-Since  Thu, 29 May 2008 09:43:46 GMT If-None-Match  &quot;12523074   &quot; 304 Not Modified
基于资源的缓存示例 <filter> <filter-name>CacheFilterStaticContent</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> <init-param> <param-name>expires</param-name> <param-value>time</param-value> </init-param> </filter> <filter-mapping> <filter-name>CacheFilterStaticContent</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>
谢 谢!

More Related Content

What's hot (20)

我对后端优化的一点想法
我对后端优化的一点想法我对后端优化的一点想法
我对后端优化的一点想法
mysqlops
?
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
thinkinlamp
?
HDInsight for Hadoopers
HDInsight for HadoopersHDInsight for Hadoopers
HDInsight for Hadoopers
Kuo-Chun Su
?
Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護
Justin Lin
?
独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐
Zheng Biao
?
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and Design
Ho Kim
?
Mongo db架构之优先方案
Mongo db架构之优先方案Mongo db架构之优先方案
Mongo db架构之优先方案
Lucien Li
?
惭测蝉辩濒遇到的一些问题
惭测蝉辩濒遇到的一些问题惭测蝉辩濒遇到的一些问题
惭测蝉辩濒遇到的一些问题
wang tongchao
?
惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训
flynofry
?
Oracle Data Buffer Cache
Oracle Data Buffer CacheOracle Data Buffer Cache
Oracle Data Buffer Cache
Sky Jian
?
【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析
【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析
【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析
maclean liu
?
Parse, cloud code 介紹
Parse, cloud code 介紹Parse, cloud code 介紹
Parse, cloud code 介紹
wantingj
?
HDInsight for Microsoft Users
HDInsight for Microsoft UsersHDInsight for Microsoft Users
HDInsight for Microsoft Users
Kuo-Chun Su
?
高性能尝础惭笔程序设计
高性能尝础惭笔程序设计高性能尝础惭笔程序设计
高性能尝础惭笔程序设计
fuchaoqun
?
【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization
tbosstraining
?
Mongo db部署架构之优先方案
Mongo db部署架构之优先方案Mongo db部署架构之优先方案
Mongo db部署架构之优先方案
Lucien Li
?
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
晓锋 陈
?
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架
Cabin WJ
?
D2 如何发现前端性能问题
D2 如何发现前端性能问题D2 如何发现前端性能问题
D2 如何发现前端性能问题
aoao
?
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
WASecurity
?
我对后端优化的一点想法
我对后端优化的一点想法我对后端优化的一点想法
我对后端优化的一点想法
mysqlops
?
浅谈 My sql 性能调优
浅谈 My sql 性能调优浅谈 My sql 性能调优
浅谈 My sql 性能调优
thinkinlamp
?
HDInsight for Hadoopers
HDInsight for HadoopersHDInsight for Hadoopers
HDInsight for Hadoopers
Kuo-Chun Su
?
Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護Java Web 程式之效能技巧與安全防護
Java Web 程式之效能技巧與安全防護
Justin Lin
?
独爽不如众乐
独爽不如众乐独爽不如众乐
独爽不如众乐
Zheng Biao
?
Web Caching Architecture and Design
Web Caching Architecture and DesignWeb Caching Architecture and Design
Web Caching Architecture and Design
Ho Kim
?
Mongo db架构之优先方案
Mongo db架构之优先方案Mongo db架构之优先方案
Mongo db架构之优先方案
Lucien Li
?
惭测蝉辩濒遇到的一些问题
惭测蝉辩濒遇到的一些问题惭测蝉辩濒遇到的一些问题
惭测蝉辩濒遇到的一些问题
wang tongchao
?
惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训惭测产补迟颈蝉学习培训
惭测产补迟颈蝉学习培训
flynofry
?
Oracle Data Buffer Cache
Oracle Data Buffer CacheOracle Data Buffer Cache
Oracle Data Buffer Cache
Sky Jian
?
【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析
【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析
【Ask maclean技术分享oracle数据库优化】awr鹰眼系列awr报告全面指标分析
maclean liu
?
Parse, cloud code 介紹
Parse, cloud code 介紹Parse, cloud code 介紹
Parse, cloud code 介紹
wantingj
?
HDInsight for Microsoft Users
HDInsight for Microsoft UsersHDInsight for Microsoft Users
HDInsight for Microsoft Users
Kuo-Chun Su
?
高性能尝础惭笔程序设计
高性能尝础惭笔程序设计高性能尝础惭笔程序设计
高性能尝础惭笔程序设计
fuchaoqun
?
【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization【第一季第四期】JavaScript Optimization
【第一季第四期】JavaScript Optimization
tbosstraining
?
Mongo db部署架构之优先方案
Mongo db部署架构之优先方案Mongo db部署架构之优先方案
Mongo db部署架构之优先方案
Lucien Li
?
Mongo db技术分享
Mongo db技术分享Mongo db技术分享
Mongo db技术分享
晓锋 陈
?
Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架Apache Zookeeper 分布式服务框架
Apache Zookeeper 分布式服务框架
Cabin WJ
?
D2 如何发现前端性能问题
D2 如何发现前端性能问题D2 如何发现前端性能问题
D2 如何发现前端性能问题
aoao
?
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
WASecurity
?

Viewers also liked (20)

开源混合存储方案(贵濒补蝉丑肠补肠丑别)
开源混合存储方案(贵濒补蝉丑肠补肠丑别)开源混合存储方案(贵濒补蝉丑肠补肠丑别)
开源混合存储方案(贵濒补蝉丑肠补肠丑别)
Feng Yu
?
Fast2016 liang ming-converged_storage_technology-final (1)
Fast2016 liang ming-converged_storage_technology-final (1)Fast2016 liang ming-converged_storage_technology-final (1)
Fast2016 liang ming-converged_storage_technology-final (1)
Liang Ming
?
下一代虚拟存储解决方案:痴补补颈
下一代虚拟存储解决方案:痴补补颈下一代虚拟存储解决方案:痴补补颈
下一代虚拟存储解决方案:痴补补颈
ITband
?
贰尘肠存储培训
贰尘肠存储培训贰尘肠存储培训
贰尘肠存储培训
Mq Sfs
?
关系数据库存储树形结构数据的理想实践 20100222
关系数据库存储树形结构数据的理想实践 20100222关系数据库存储树形结构数据的理想实践 20100222
关系数据库存储树形结构数据的理想实践 20100222
Cabin WJ
?
结构化数据存储
结构化数据存储结构化数据存储
结构化数据存储
光照 刘
?
华为软件定义存储架构分析
华为软件定义存储架构分析华为软件定义存储架构分析
华为软件定义存储架构分析
Liang Ming
?
融合存储技术
融合存储技术融合存储技术
融合存储技术
Liang Ming
?
Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25
Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25
Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25
Vanbin Fan, JWMI MBA
?
软件定义存储
软件定义存储软件定义存储
软件定义存储
Liang Ming
?
Europe
EuropeEurope
Europe
lola guillen
?
Creating a Helpdesk Where None Exists
Creating a Helpdesk Where None ExistsCreating a Helpdesk Where None Exists
Creating a Helpdesk Where None Exists
Elizabeth Nesius
?
The practices, challenges and opportunities of board composition and leadersh...
The practices, challenges and opportunities of board composition and leadersh...The practices, challenges and opportunities of board composition and leadersh...
The practices, challenges and opportunities of board composition and leadersh...
Mohammed Farrag
?
4th grade curriculum night classroom 10 11
4th grade curriculum night classroom  10 114th grade curriculum night classroom  10 11
4th grade curriculum night classroom 10 11
Bret Biornstad
?
Comparatives1
Comparatives1Comparatives1
Comparatives1
lola guillen
?
2013 accenture-consumer-electronics-products-and-services-usage-report
2013 accenture-consumer-electronics-products-and-services-usage-report2013 accenture-consumer-electronics-products-and-services-usage-report
2013 accenture-consumer-electronics-products-and-services-usage-report
Fran?ois Avril
?
Bando Start Up Er
Bando Start Up ErBando Start Up Er
Bando Start Up Er
Francesco Baruffi
?
Wiki Technology By It Rocks
Wiki Technology By It RocksWiki Technology By It Rocks
Wiki Technology By It Rocks
naveenv
?
Sf 02S201test
Sf 02S201testSf 02S201test
Sf 02S201test
guest02b3e
?
开源混合存储方案(贵濒补蝉丑肠补肠丑别)
开源混合存储方案(贵濒补蝉丑肠补肠丑别)开源混合存储方案(贵濒补蝉丑肠补肠丑别)
开源混合存储方案(贵濒补蝉丑肠补肠丑别)
Feng Yu
?
Fast2016 liang ming-converged_storage_technology-final (1)
Fast2016 liang ming-converged_storage_technology-final (1)Fast2016 liang ming-converged_storage_technology-final (1)
Fast2016 liang ming-converged_storage_technology-final (1)
Liang Ming
?
下一代虚拟存储解决方案:痴补补颈
下一代虚拟存储解决方案:痴补补颈下一代虚拟存储解决方案:痴补补颈
下一代虚拟存储解决方案:痴补补颈
ITband
?
贰尘肠存储培训
贰尘肠存储培训贰尘肠存储培训
贰尘肠存储培训
Mq Sfs
?
关系数据库存储树形结构数据的理想实践 20100222
关系数据库存储树形结构数据的理想实践 20100222关系数据库存储树形结构数据的理想实践 20100222
关系数据库存储树形结构数据的理想实践 20100222
Cabin WJ
?
结构化数据存储
结构化数据存储结构化数据存储
结构化数据存储
光照 刘
?
华为软件定义存储架构分析
华为软件定义存储架构分析华为软件定义存储架构分析
华为软件定义存储架构分析
Liang Ming
?
融合存储技术
融合存储技术融合存储技术
融合存储技术
Liang Ming
?
Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25
Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25
Persona & Scenarios for Baidu Cloud - By Vanbin Fan 2012.12.25
Vanbin Fan, JWMI MBA
?
软件定义存储
软件定义存储软件定义存储
软件定义存储
Liang Ming
?
Creating a Helpdesk Where None Exists
Creating a Helpdesk Where None ExistsCreating a Helpdesk Where None Exists
Creating a Helpdesk Where None Exists
Elizabeth Nesius
?
The practices, challenges and opportunities of board composition and leadersh...
The practices, challenges and opportunities of board composition and leadersh...The practices, challenges and opportunities of board composition and leadersh...
The practices, challenges and opportunities of board composition and leadersh...
Mohammed Farrag
?
4th grade curriculum night classroom 10 11
4th grade curriculum night classroom  10 114th grade curriculum night classroom  10 11
4th grade curriculum night classroom 10 11
Bret Biornstad
?
2013 accenture-consumer-electronics-products-and-services-usage-report
2013 accenture-consumer-electronics-products-and-services-usage-report2013 accenture-consumer-electronics-products-and-services-usage-report
2013 accenture-consumer-electronics-products-and-services-usage-report
Fran?ois Avril
?
Wiki Technology By It Rocks
Wiki Technology By It RocksWiki Technology By It Rocks
Wiki Technology By It Rocks
naveenv
?

Similar to 缓存技术浅谈 (20)

高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践
longhao
?
尝补尘辫高性能设计
尝补尘辫高性能设计尝补尘辫高性能设计
尝补尘辫高性能设计
锐 张
?
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
maclean liu
?
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
Frank Cai
?
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
self study
?
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
rewinx
?
淘宝商品库惭测厂蚕尝优化实践
淘宝商品库惭测厂蚕尝优化实践淘宝商品库惭测厂蚕尝优化实践
淘宝商品库惭测厂蚕尝优化实践
Feng Yu
?
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
Ailsa126
?
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
Li JianYe
?
摘星
摘星摘星
摘星
zenyuhao
?
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
Tony Deng
?
构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构
Cosey Lee
?
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
d0nn9n
?
海量日志分析系统实践,顿产补
海量日志分析系统实践,顿产补海量日志分析系统实践,顿产补
海量日志分析系统实践,顿产补
Cevin Cheung
?
Altibase管理培训 安装篇
Altibase管理培训 安装篇Altibase管理培训 安装篇
Altibase管理培训 安装篇
小新 制造
?
前端性能测试
前端性能测试前端性能测试
前端性能测试
tbmallf2e
?
高性能奥别产服务器苍驳颈苍虫及相关新技术的应用
高性能奥别产服务器苍驳颈苍虫及相关新技术的应用高性能奥别产服务器苍驳颈苍虫及相关新技术的应用
高性能奥别产服务器苍驳颈苍虫及相关新技术的应用
redhat9
?
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践
longhao
?
尝补尘辫高性能设计
尝补尘辫高性能设计尝补尘辫高性能设计
尝补尘辫高性能设计
锐 张
?
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
【Maclean liu技术分享】开oracle调优鹰眼,深入理解awr性能报告 第二讲 正式版 20130410
maclean liu
?
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
Frank Cai
?
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
self study
?
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
高性能奥别产服务器狈驳颈苍虫及相关新技术的应用实践
rewinx
?
淘宝商品库惭测厂蚕尝优化实践
淘宝商品库惭测厂蚕尝优化实践淘宝商品库惭测厂蚕尝优化实践
淘宝商品库惭测厂蚕尝优化实践
Feng Yu
?
浅析浏览器解析和渲染
浅析浏览器解析和渲染浅析浏览器解析和渲染
浅析浏览器解析和渲染
Ailsa126
?
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
Li JianYe
?
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
Tony Deng
?
构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构构建基于尝补尘辫的网站架构
构建基于尝补尘辫的网站架构
Cosey Lee
?
Huangjing renren
Huangjing renrenHuangjing renren
Huangjing renren
d0nn9n
?
海量日志分析系统实践,顿产补
海量日志分析系统实践,顿产补海量日志分析系统实践,顿产补
海量日志分析系统实践,顿产补
Cevin Cheung
?
Altibase管理培训 安装篇
Altibase管理培训 安装篇Altibase管理培训 安装篇
Altibase管理培训 安装篇
小新 制造
?
前端性能测试
前端性能测试前端性能测试
前端性能测试
tbmallf2e
?
高性能奥别产服务器苍驳颈苍虫及相关新技术的应用
高性能奥别产服务器苍驳颈苍虫及相关新技术的应用高性能奥别产服务器苍驳颈苍虫及相关新技术的应用
高性能奥别产服务器苍驳颈苍虫及相关新技术的应用
redhat9
?

More from Robbin Fan (11)

奥别产并发模型粗浅探讨
奥别产并发模型粗浅探讨奥别产并发模型粗浅探讨
奥别产并发模型粗浅探讨
Robbin Fan
?
精益创业讨论
精益创业讨论精益创业讨论
精益创业讨论
Robbin Fan
?
运营专业型社区的经验和反思
运营专业型社区的经验和反思运营专业型社区的经验和反思
运营专业型社区的经验和反思
Robbin Fan
?
Social Game的技术挑战
Social Game的技术挑战Social Game的技术挑战
Social Game的技术挑战
Robbin Fan
?
Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...
Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...
Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...
Robbin Fan
?
ruby on rails pitfalls
ruby on rails pitfallsruby on rails pitfalls
ruby on rails pitfalls
Robbin Fan
?
Ruby In Enterprise Development
Ruby In Enterprise DevelopmentRuby In Enterprise Development
Ruby In Enterprise Development
Robbin Fan
?
Maximes Presentation For Rubyconf China 2009
Maximes Presentation For Rubyconf China 2009Maximes Presentation For Rubyconf China 2009
Maximes Presentation For Rubyconf China 2009
Robbin Fan
?
Why Ruby?
Why Ruby?Why Ruby?
Why Ruby?
Robbin Fan
?
Design Pattern From Java To Ruby
Design Pattern    From Java To RubyDesign Pattern    From Java To Ruby
Design Pattern From Java To Ruby
Robbin Fan
?
Java Eye Architecture
Java Eye ArchitectureJava Eye Architecture
Java Eye Architecture
Robbin Fan
?
奥别产并发模型粗浅探讨
奥别产并发模型粗浅探讨奥别产并发模型粗浅探讨
奥别产并发模型粗浅探讨
Robbin Fan
?
精益创业讨论
精益创业讨论精益创业讨论
精益创业讨论
Robbin Fan
?
运营专业型社区的经验和反思
运营专业型社区的经验和反思运营专业型社区的经验和反思
运营专业型社区的经验和反思
Robbin Fan
?
Social Game的技术挑战
Social Game的技术挑战Social Game的技术挑战
Social Game的技术挑战
Robbin Fan
?
Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...
Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...
Challenge of SHIMANE - Example of use Ruby in Japanese regional government an...
Robbin Fan
?
ruby on rails pitfalls
ruby on rails pitfallsruby on rails pitfalls
ruby on rails pitfalls
Robbin Fan
?
Ruby In Enterprise Development
Ruby In Enterprise DevelopmentRuby In Enterprise Development
Ruby In Enterprise Development
Robbin Fan
?
Maximes Presentation For Rubyconf China 2009
Maximes Presentation For Rubyconf China 2009Maximes Presentation For Rubyconf China 2009
Maximes Presentation For Rubyconf China 2009
Robbin Fan
?
Design Pattern From Java To Ruby
Design Pattern    From Java To RubyDesign Pattern    From Java To Ruby
Design Pattern From Java To Ruby
Robbin Fan
?
Java Eye Architecture
Java Eye ArchitectureJava Eye Architecture
Java Eye Architecture
Robbin Fan
?

缓存技术浅谈

  • 2. 缓存是什么,解决什么问题? Cache 是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问 凡是位于速度相差较大的两种硬件 / 软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache
  • 3. 基于 Web 应用的系统架构图 数据库 应用服务器 Web 服务器 存储设备 浏览器 Web 应用架构 操作系统的文件系统
  • 4. Web 应用系统存在哪些速度差异? 读取文件系统 ? 读取磁盘 读取数据库内存 ? 读取文件系统 读取应用内存 ? 访问数据库服务器 读取静态文件 ? 访问应用服务器 读取浏览器缓存 ? 访问网站
  • 5. 缓存技术分类 操作系统磁盘缓存 ? 减少磁盘机械操作 数据库缓存 ? 减少文件系统 I/O 应用程序缓存 ? 减少对数据库的查询 Web 服务器缓存 ? 减少应用服务器请求 客户端浏览器缓存 ? 减少对网站的访问
  • 6. 操作系统缓存概述 文件系统提供的 Disk Cache :操作系统会把经常访问到的文件内容放入到内存当中,由文件系统来管理 当应用程序通过文件系统访问磁盘文件的时候,操作系统从 Disk Cache 当中读取文件内容,加速了文件读取速度 Disk Cache 由操作系统来自动管理,一般不用人工干预,但应当保证物理内存充足,以便于操作系统可以使用尽量多的内存充当 Disk Cache ,加速文件读取速度 特殊的应用程序对文件系统 Disk Cache 有很高的要求,会绕开文件系统 Disk Cache ,直接访问磁盘分区,自己实现 Disk Cache 策略 Oracle 的 raw device( 裸设备 ) – 直接抛弃文件系统 MySQL 的 InnoDB : innodb_flush_method = O_DIRECT
  • 9. 数据库缓存的重要性 为什么数据库非常依赖缓存? 数据库通常是公司应用系统最核心的部分 数据库保存的数据量通常非常庞大 数据库查询操作通常很频繁,有时还很复杂 以上原因造成数据库查询会引起非常频繁的磁盘 I/O 读取操作,迫使 CPU 挂起等待,数据库性能极度低下 数据库有哪些缓存策略? Query Cache Data Buffer
  • 10. Query Cache 以 SQL 作为 key 值缓存查询结果集 一旦查询涉及的表记录被修改,缓存就会被自动删除 设置合适的 Query Cache 会极大提高数据库性能 Query Cache 并非越大越好,过大的 Qquery Cache 会浪费内存。 MySQL: query_cache_size= 128M
  • 11. MySQL Query Cache 监控工具 show status like 'Qcache%'; mysqlreport 脚本 MySQL Administrator
  • 12. Query Cache 状态示例 __ Query Cache ______________________________________________ Memory usage 25.77M of 64.00M %Used: 40.26 Block Fragmnt 24.73% Hits 6.98M 3.2/s Inserts 100.87M 46.9/s Insrt:Prune 34.15:1 45.5/s Hit:Insert 0.07:1
  • 13. Data Buffer data buffer 是数据库数据在内存中的容器 data buffer 的命中率直接决定了数据库的性能 data buffer 越大越好,多多益善 MySQL 的 InnoDB buffer : innodb_buffer_pool_size = 2G MySQL 建议 buffer pool 开大到服务器物理内存 60-80%
  • 14. MySQL buffer 监控工具 show innodb status\G show status like 'innodb%'; mysqlreport 脚本 innotop
  • 15. InnoDB buffer 状态示例 __ InnoDB Buffer Pool ______________________________________ Usage 1000.00 of 1000.00 %Used: 100.00 Read hit 99.99% Pages Free 0 %Total: 0.00 Data 59.69k 93.26 % Drty: 0.02 Misc 4311 6.74 Latched 0 0.00 Reads 60.30G 28.0k/s From file 7.01M 3.3/s 0.01 Ahead Rnd 98684 0.0/s Ahead Sql 9548 0.0/s Writes 86.79M 40.3/s Flushes 14.08M 6.5/s Wait Free 0 0/s
  • 16. 应用程序缓存概述 对象缓存 查询缓存 页面缓存 动态页面静态化 Servlet 缓存 页面内部缓存
  • 17. 对象缓存 由 O/R Mapping 框架例如 Hibernate 提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程,是最省事的缓存策略 当软件结构按照 O/R Mapping 框架的要求进行针对性设计,使用对象缓存将会极大降低 Web 系统对于数据库的访问请求 良好的设计数据库结构和利用对象缓存,能够提供极高的性能,对象缓存适合 OLTP (联机事务处理)应用
  • 18. 对象缓存分类 对映射数据库表记录的 entity 对象进行缓存 对 1 对 n 关系的集合进行缓存 对 n 对 1 关系的关联对象进行缓存
  • 19. Hibernate 对象缓存配置 @Entity @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class Forest { ... } 配置 entity 对象缓存 配置关联集合的缓存 @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) @JoinColumn(name=&quot;CUST_ID&quot;) @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public SortedSet<Ticket> getTickets() { return tickets; } 仅仅添加 Annotation 就可以了,无须编码,即可自动享受对象缓存。 Hibernate 会拦截对象的 CRUD 操作,针对对象读取操作进行缓存,针对对象修改操作自动清理缓存
  • 20. Hibernate 二级缓存是提升 web 应用性能的法宝 OLTP 类型的 web 应用,由于应用服务器端可以进行群集水平扩展,最终的系统瓶颈总是逃不开数据库访问; 哪个框架能够最大限度减少数据库访问,降低数据库访问压力,哪个框架提供的性能就更高; 针对数据库的缓存策略: 对象缓存:细颗粒度,针对表的记录级别,透明化访问,在不改变程序代码的情况下可以极大提升 web 应用的性能。对象缓存是 ORM 的制胜法宝。 对象缓存的优劣取决于框架实现的水平, Hibernate 是目前已知对象缓存最强大的开源 ORM 查询缓存:粗颗粒度,针对查询结果集,应用于数据实时化要求不高的场合
  • 21. 查询缓存 对数据库查询结果集进行缓存,类似数据库的 Query Cache 适用于一些耗时,但是时效性要求比较低的场景。查询缓存和对象缓存适用的场景不一样,是互为补充的 当查询结果集涉及的表记录被修改以后,需要注意清理缓存
  • 22. Hibernate 查询缓存 在配置文件中打开 Query Cache hibernate.cache.use_query_cache true 在查询的时候显式编码使用 Cache List blogs = sess.createQuery(&quot;from Blog blog where blog.blogger = :blogger&quot;) .setEntity(&quot;blogger&quot;,blogger) . setMaxResults(15) . setCacheable(true) . setCacheRegion(&quot;frontpages&quot;) . list();
  • 23. Hibernate 查询缓存特征 并非缓存整个查询结果集,而是缓存查询结果集 entity 对象的 id 集合 [blogId1, blogId2, blogId3,…] 在遍历结果集的时候,再按照 blogId 去查询 blog 对象,例如 select blog.* from blog where id=? 如果此时 blog 配置了对象缓存,则自动读取对象缓存 Hibernate 查询缓存会自动清理过期缓存 一旦结果集涉及的 entity 被修改,查询缓存就被自动清理
  • 24. 页面缓存 页面缓存的作用是什么? 针对页面的缓存技术不但可以减轻数据库服务器压力,还可以减轻应用服务器压力 好的页面缓存可以极大提高页面渲染速度 页面缓存的难点在于如何清理过期的缓存 页面缓存技术有哪些? 动态页面静态化 Servlet 缓存 页面局部缓存
  • 25. 动态页面静态化 利用模板技术将访问过一次的动态页面生成静态 html ,同时修改页面链接,下一次请求直接访问静态链接页面 动态页面静态化技术的广泛应用于互联网 CMS/ 新闻类 Web 应用,但也有 BBS 应用使用该技术,例如 Discuz! 无法进行权限验证,无法显示个性化信息 可以使用 AJAX 请求弥补动态页面静态化的某些缺点
  • 26. Servlet 缓存 针对 URL 访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布 可以进行权限的检查 OScache 提供了简单的 Servlet 缓存 ( 通过 web.xml 中的配置 ) 也可以自己编程实现 Servlet 缓存
  • 27. OSCache Servlet 缓存示例 <filter> <filter-name>CacheFilter</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> <init-param> <param-name>time</param-name> <param-value>600</param-value> </init-param> <init-param> <param-name>scope</param-name> <param-value>session</param-value> </init-param> </filter> <filter-mapping> <filter-name>CacheFilter</filter-name> <url-pattern>/news/*</url-pattern> </filter-mapping>
  • 28. 页面局部缓存 针对动态页面的局部片断内容进行缓存,适用于一些个性化但不经常更新的页面 ( 例如博客 ) OSCache 提供了简单的页面缓存 可以自行扩展 JSP Tag 实现页面局部缓存
  • 29. OSCache 的页面局部缓存 <%@ taglib uri=&quot;http://www.opensymphony.com/oscache&quot; prefix=&quot;cache&quot; %> <cache:cache> ... some jsp content ... </cache:cache> <cache:cache key=&quot;foobar&quot; scope=&quot;session&quot;> ... some jsp content ... </cache:cache> <cache:cache key=&quot;<%= product.getId() %>&quot; time=&quot;1800&quot; refresh=&quot;<%= needRefresh %>&quot;> ... some jsp content ... </cache:cache> <cache:cache key=&quot;<%= product.getId() %>&quot; cron=&quot;0 2 * * *&quot; refresh=&quot;<%= needRefresh %>&quot;> ... some jsp content ... </cache:cache>
  • 30. 应用缓存的缓存服务器 EHCache 适合充当对象缓存和 Hibernate 集成效果很好, Gavin King 也是 EHCache 作者之一 OSCache 充当 Servlet 和页面缓存 在一个 Web 应用当中可以同时使用 OSCache 和 EHCache JBossCache 在 Java 群集环境下使用 支持缓存在节点之间的复制,在 JBoss AS 上被用来实现 HTTP Session 的内存复制功能
  • 31. 非 Java 实现的通用缓存产物 Memcached 在大规模互联网应用下使用 每秒支撑 1.5 万~ 2 万次请求 Tokyo Tyrant 兼容 memcached 协议,可以持久化存储 支持故障切换,对缓存服务器有高可靠性要求可以使用 每秒支撑 0.5 万~ 0.8 万次请求
  • 32. Web 服务器端缓存技术 基于代理服务器模式的 Web 服务器端缓存 squid/nginx Web 服务器缓存技术被用来实现 CDN (内容分发网络 content delivery network ) 被国内主流门户网站大量采用 不需要编程,但仅限于新闻发布类网站,页面实时性要求不高
  • 33. 基于 AJAX 技术的浏览器缓存 使用 AJAX 调用的时候,将数据库在浏览器端缓存 只要不离开当前页面,不刷新当前页面,就可以直接读取缓存数据 只适用于使用 AJAX 技术的页面
  • 34. 未使用 AJAX 缓存代码 1. <script src=/slideshow/ss-5275090/5275090/&quot;jQuery.js&quot;></script> 2. <script language=&quot;JavaScript&quot;> 3. <!-- 4. function gopage(option,obj){ 5. var page = $(&quot;#page&quot;).html() * 1; 6. obj.disabled = true; 7. if(option == '+'){ 8. page ++ ; 9. var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random(); 10. // 获取 ajax url ,后面的 random 是为了防止浏览器缓存 xml 内容 11. }else{ 12. page --; 13. if(page < 1)page =1; 14. var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random(); 15. 16. } 17. $(&quot;#data&quot;).html(&quot;loading...&quot;);// 设置 loading 状态 18. $(&quot;#page&quot;).html(page); 19. // 下面是 ajax 处理 20. $(&quot;#data&quot;).load(url, 21. {limit: 25}, 22. function() { obj.disabled = false; } 23. ); 24. 25. } 26. //--> 27. </script> 28. <input value=&quot;<&quot; onclick=&quot;gopage('-',this)&quot; type=&quot;button&quot;> 29. <input value=&quot;>&quot; onclick=&quot;gopage('+',this)&quot; type=&quot;button&quot;> 30. page:<span id=&quot;page&quot;>1</span> 31. <div style=&quot;border: 2px solid red; padding: 2px;&quot; id=&quot;data&quot;>data area</div>
  • 35. 使用 AJAX 缓存代码 # <script language=&quot;JavaScript&quot;> # <!-- # var cache_data = new Array();// 定义全局变量用来保存缓存数据 # function gopageCache(option,obj){ # var page = $(&quot;#page2&quot;).html() * 1; # if(option == '+'){ # page ++ ; # var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random(); # }else{ # page --; # if(page < 1)page =1; # var url = &quot;data.php?page=&quot;+page + &quot;&r=&quot;+Math.random(); # # } # /* 下面是缓存增加的部分 */ # if( (cache_data[page] !=null) && (cache_data[page].length > 1) ) { # // 如果缓存存在 , 则直接调用缓存数据 , 不用再去服务器进行数据请求 # alert('cache hit'); # $(&quot;#data2&quot;).html(cache_data[page]); # $(&quot;#page2&quot;).html(page); # return true; # } # $(&quot;#page2&quot;).html(page); # obj.disabled = true; # $(&quot;#data2&quot;).html(&quot;loading(cache enabled)...&quot;); # $(&quot;#data2&quot;).load(url, # {limit: 25}, # function(responseText) { obj.disabled = false; # cache_data[page] = responseText;// 将当前的数据存入到内存 ( 缓存变量 ) 中 } # ); # # } # # //--> # </script> # <input value=&quot;<&quot; onclick=&quot;gopageCache('-',this)&quot; type=&quot;button&quot;> # <input value=&quot;>&quot; onclick=&quot;gopageCache('+',this)&quot; type=&quot;button&quot;> # page:<span id=&quot;page2&quot;>1</span> # <div style=&quot;border: 2px solid red; padding: 2px;&quot; id=&quot;data2&quot;>data area</div>
  • 36. 基于 HTTP 协议的资源缓存 Etag &quot;12523074“ Last-Modified Thu, 29 May 2008 09:43:46 GMT /blog /blog If-Modified-Since Thu, 29 May 2008 09:43:46 GMT If-None-Match &quot;12523074 &quot; 304 Not Modified
  • 37. 基于资源的缓存示例 <filter> <filter-name>CacheFilterStaticContent</filter-name> <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class> <init-param> <param-name>expires</param-name> <param-value>time</param-value> </init-param> </filter> <filter-mapping> <filter-name>CacheFilterStaticContent</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping>