缓存
一、什么是缓存?
1.缓存Cache是高速缓冲存储器,一种特殊的存储器子系统,其中复制了我们频繁需要操作的数据使得这些数据可以快速的访问。
2.凡是位于速度相差比较大的两种硬件或软件之间的,用于协调两者数据之间传输速度差异的结构,我们都可以称之为缓存Cache.
二、缓存分类
1. 基于web应用的架构图

这个图可以简单的理解:浏览器发送一个http请求到Web服务器,Web服务器通过应用服务器去查询数据库中的数据,数据库通过IO访问磁盘文件查询数据。
那么其实在 浏览器和服务器之间、服务器与服务器之间、服务器与数据库之间都可以加入缓存。
数据库与存储设备之间:通过加入缓存,那么就减少了磁盘文件IO的操作
应用服务器与数据库之间:减少对数据库查询的操作,这个是比较常用的
客户端与Web服务器之间:减少对网站的访问,这个我倒是没见过,一般用nginx负载均衡
三、操作系统缓存
1.文件系统提供的磁盘缓存Disk Cache:操作习题会把经常访问到的文件内容放到内存中,由文件系统来管理。
2.当应用程序通过文件系统访问磁盘文件时候,操作系统会从Disk Cache读取文件数据,这样就加快了文件访问的速度。
3.Disk Cache 由操作系统来管理,一般不需要人工干预,但应保证物理内存充足,以便操作系统可以使用更多的内存来缓存数据。
四、数据库缓存
1.重要性
- 数据库通常是企业应用系统最核心的部分
- 数据库保存的数据量一般很庞大
- 数据库查询操作频繁
- 上述原因会导致数据库查询频繁的进行磁盘IO操作,使得数据库性能下降
2.缓存策略
a、Query Cache
- 以SQL作为key值缓存查询结果集
- 一旦查询涉及的表记录被修改,缓存就会被自动删除
- 设置合适的Query Cache会极大提高数据库性能
- Query Cache并非越大越好,过大的Qquery Cache会浪费内存。
- MySQL: query_cache_size= 128M
b、Data Buffer
- data buffer是数据库数据在内存中的容器
- data buffer的命中率直接决定了数据库的性能
- data buffer越大越好,多多益善
- MySQL的InnoDB buffer:innodb_buffer_pool_size = 2G
- MySQL建议buffer pool开大到服务器物理内存60-80%
五、应用程序缓存
1、对象缓存
- 由O/R Mapping框架例如Hibernate提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程,是最省事的缓存策略
- 当软件结构按照O/R Mapping框架的要求进行针对性设计,使用对象缓存将会极大降低Web系统对于数据库的访问请求
- 良好的设计数据库结构和利用对象缓存,能够提供极高的性能,对象缓存适合OLTP(联机事务处理)应用
2、查询缓存
- 对数据库查询结果集进行缓存,类似数据库的Query Cache
- 适用于一些耗时,但是时效性要求比较低的场景。查询缓存和对象缓存适用的场景不一样,是互为补充的
- 当查询结果集涉及的表记录被修改以后,需要注意清理缓存
3、页面缓存
a、作用
- 针对页面的缓存技术不但可以减轻数据库服务器压力,还可以减轻应用服务器压力
- 好的页面缓存可以极大提高页面渲染速度
- 页面缓存的难点在于如何清理过期的缓存
b、分类
I、动态页面静态化
- 利用模板技术将访问过一次的动态页面生成静态html,同时修改页面链接,下一次请求直接访问静态链接页面(freemaker)
- 动态页面静态化技术的广泛应用于互联网CMS/新闻类Web应用,但也有BBS应用使用该技术,例如Discuz!
- 无法进行权限验证,无法显示个性化信息
- 可以使用AJAX请求弥补动态页面静态化的某些缺点
II、Servlet缓存
- 针对URL访问返回的页面结果进行缓存,适用于粗粒度的页面缓存,例如新闻发布
- 可以进行权限的检查
- OScache提供了简单的Servlet缓存(通过web.xml中的配置)
- 也可以自己编程实现Servlet缓存
III、页面内部缓存
- 针对动态页面的局部片断内容进行缓存,适用于一些个性化但不经常更新的页面(例如博客)
- OSCache提供了简单的页面缓存
- 可以自行扩展JSP Tag实现页面局部缓存
六、web服务器端缓存
- 基于代理服务器模式的Web服务器端缓存,如squid/nginx
- Web服务器缓存技术被用来实现CDN(内容分发网络 content delivery network)
- 被国内主流门户网站大量采用
- 不需要编程,但仅限于新闻发布类网站,页面实时性要求不高
七、基于ajax的浏览器缓存
- 使用AJAX调用的时候,将数据库在浏览器端缓存
- 只要不离开当前页面,不刷新当前页面,就可以直接读取缓存数据
- 只适用于使用AJAX技术的页面
csdn:https://blog.csdn.net/weixin_44185666

浙公网安备 33010602011771号