缓存技术浅析

操作系统磁盘缓存        减少磁盘机械操作

数据库缓存                 减少文件系统I/O

应用程序缓存              减少对数据库的查询 

Web服务器缓存         减少应用服务器请求

客户端浏览器缓存       减少对网站的访问


数据库缓存:

 数据库通常是企业应用系统最核心的部分
 数据库保存的数据量通常非常庞大
 数据库查询操作通常很频繁,有时还很复杂
 以上原因造成数据库查询会引起非常频繁的磁盘I/O读取操作,迫使CPU挂起等待,数据库性能极度低下
数据库有哪些缓存策略?
 Query Cache
 Data Buffer


以SQL作为key值缓存查询结果集
 一旦查询涉及的表记录被修改,缓存就会被自动删除
 设置合适的Query Cache会极大提高数据库性能
Query Cache并非越大越好,过大的Qquery Cache会浪费内存。
MySQL: query_cache_size= 128M


MySQL Query Cache监控工具
show status like 'Qcache%';
mysqlreport脚本
MySQL Administrator


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


应用程序缓存概述
对象缓存
查询缓存
页面缓存
 动态页面静态化
 Servlet缓存
 页面内部缓存

对数据库查询结果集进行缓存,类似数据库的Query Cache

适用于一些耗时,但是时效性要求比较低的场景。查询缓存和对象缓存适用的场景不一样,是互为补充的

当查询结果集涉及的表记录被修改以后,需要注意清理缓存

页面缓存的作用是什么?

 针对页面的缓存技术不但可以减轻数据库服务器压力,还可以减轻应用服务器压力

 好的页面缓存可以极大提高页面渲染速度

 页面缓存的难点在于如何清理过期的缓存

页面缓存技术有哪些?

 动态页面静态化 利用模板技术静态化,请求直接访问静态页面。可以使用AJAX请求弥补动态页面静态化后的某些缺点;

 Servlet缓存

 页面局部缓存


通用缓存产品:
memcached
 在大规模互联网应用下使用
 每秒支撑1.5万~2万次请求


Web服务器端缓存技术

基于代理服务器模式的Web服务器端缓存
 squid/nginx
Web服务器缓存技术被用来实现CDN(内容分发网络 content delivery network)
 被国内主流门户网站大量采用
 不需要编程,但仅限于新闻发布类网站,页面实时性要求不高

基于Ajax的缓存代码:

<script language="JavaScript">  

#   <!--  

# var cache_data = new Array();//定义全局变量用来保存缓存数据  

#     function gopageCache(option,obj){  

#     var page = $("#page2").html() * 1;    

#     if(option == '+'){  

#         page ++ ;  

#         var url = "data.php?page="+page + "&r="+Math.random();  

#     }else{  

#         page --;  

#         if(page < 1)page =1;  

#         var url = "data.php?page="+page + "&r="+Math.random();  

#   

#     }  

# /*下面是缓存增加的部分*/  

#     if( (cache_data[page] !=null) && (cache_data[page].length > 1) ) {  

# //如果缓存存在,则直接调用缓存数据,不用再去服务器进行数据请求  

#         alert('cache hit');  

#         $("#data2").html(cache_data[page]);  

#         $("#page2").html(page);  

#         return true;  

#     }  

#     $("#page2").html(page);  

#     obj.disabled = true;  

#     $("#data2").html("loading(cache enabled)...");    

#     $("#data2").load(url,  

#         {limit: 25},  

#              function(responseText) { obj.disabled = false;  

#                             cache_data[page] = responseText;//将当前的数据存入到内存(缓存变量)中 }  

#         );  

#   

#     }  

#   

#   //-->  

#   </script>  

# <input value="<" onclick="gopageCache('-',this)" type="button">  

# <input value=">" onclick="gopageCache('+',this)" type="button">  

#   page:<span id="page2">1</span>  

# <div style="border: 2px solid red; padding: 2px;" id="data2">data area</div> 


猜你喜欢

转载自hanwesley.iteye.com/blog/1722132