一、什么是缓存
1、Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问
2、凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为 Cache

二、缓存的分类
1、基于web应用的系统架构图

2、在系统架构的不同层级之间,为了加快访问速度,都可以存在缓存

  • 操作系统磁盘缓存->减少磁盘机械操作
  • 数据库缓存->减少文件系统I/O
  • 应用程序缓存->减少对数据库的查询
  • Web服务器缓存->减少应用服务器请求
  • 客户端浏览器缓存->减少对网站的访问

三、操作系统缓存
1、文件系统提供的Disk Cache:操作系统会把经常访问到的文件内容放入到内存当中,由文件系统来管理
2、当应用程序通过文件系统访问磁盘文件的时候,操作系统从Disk Cache当中读取文件内容,加速了文件读取速度
3、Disk Cache由操作系统来自动管理,一般不用人工干预,但应当保证物理内存充足,以便于操作系统可以使用尽量多的内存充当Disk Cache,加速文件读取速度
4、特殊的应用程序对文件系统Disk Cache有很高的要求,会绕开文件系统Disk Cache,直接访问磁盘分区,自己实现Disk 
5、Cache策略

  • Oracle的raw device(裸设备) – 直接抛弃文件系统
  • MySQL的InnoDB: innodb_flush_method = O_DIRECT

四、数据库缓存
1、重要性

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

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,同时修改页面链接,下一次请求直接访问静态链接页面
    • 动态页面静态化技术的广泛应用于互联网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技术的页面

J2EE开发中常用的缓存策略的更多相关文章

  1. java web开发中常用的协议的使用和java-web 常见的缓冲技术

    一.DNS协议 作用将域名解析为IP   类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...

  2. 在 Android开发中,性能优化策略十分重要

    在 Android开发中,性能优化策略十分重要本文主要讲解性能优化中的布局优化,希望你们会喜欢.目录 示意图 1. 影响的性能 布局性能的好坏 主要影响 :Android应用中的页面显示速度 2. 如 ...

  3. .net开发中常用的第三方组件

    .net开发中常用的第三方组件 2013-05-09 09:33:32|  分类: dotnet |举报 |字号 订阅     下载LOFTER 我的照片书  |   RSS.NET.dll RSS. ...

  4. 依赖注入及AOP简述(十)——Web开发中常用Scope简介 .

    1.2.    Web开发中常用Scope简介 这里主要介绍基于Servlet的Web开发中常用的Scope. l        第一个比较常用的就是Application级Scope,通常我们会将一 ...

  5. spring注解开发中常用注解以及简单配置

    一.spring注解开发中常用注解以及简单配置 1.为什么要用注解开发:spring的核心是Ioc容器和Aop,对于传统的Ioc编程来说我们需要在spring的配置文件中邪大量的bean来向sprin ...

  6. Android源码浅析(四)——我在Android开发中常用到的adb命令,Linux命令,源码编译命令

    Android源码浅析(四)--我在Android开发中常用到的adb命令,Linux命令,源码编译命令 我自己平时开发的时候积累的一些命令,希望对你有所帮助 adb是什么?: adb的全称为Andr ...

  7. Universal-Image-Loader源码分析,及常用的缓存策略

    讲到图片请求,主要涉及到网络请求,内存缓存,硬盘缓存等原理和4大引用的问题,概括起来主要有以下几个内容: 原理示意图 主体有三个,分别是UI,缓存模块和数据源(网络).它们之间的关系如下: ① UI: ...

  8. 2019-2-20C#开发中常用加密解密方法解析

    C#开发中常用加密解密方法解析 一.MD5加密算法 我想这是大家都常听过的算法,可能也用的比较多.那么什么是MD5算法呢?MD5全称是 message-digest algorithm 5[|ˈmes ...

  9. 开发中常用的es6知识

    结合实际开发,开发中常用的es6的知识: 1.新增let和const命令: ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效: cons ...

随机推荐

  1. JavaBean学习--练习示例

    初识Javabean,没感觉这鸟东西有什么好用的,一定是我太笨了 自己用jsp测试了下,这里用application作用域做个示例 <%@ page language="java&qu ...

  2. 2015-09-22CSS:border、background、表格、超链接、overflow、firebug

    1.CSS的border属性 ⑴定义和用法 border 简写属性在一个声明设置所有的边框属性. 可以按顺序设置如下属性: border-width border-style border-color ...

  3. python中的generator, iterator, iterabel

    先来看看如果遇到一个对象,如何判断其是否是这三种类型: from types import GeneratorType from collectiuons import Iterable, Itera ...

  4. Android - Layout时发生'Unfortunately xxx has stopped'

    概述 我在进行LinearLayout和TableLayout的嵌套布局的时候,发生题的错误.如下布局xml代码: <LinearLayout xmlns:android="http: ...

  5. ASP.NET性能优化小结

    一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...

  6. ORACLE 解析xml字符串-转载的

    --------------------------方法一------------------------------------- 1.xml字符串 /* <orderlist>     ...

  7. PHP json的插入和解析在数据库中的操作

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. PHP中往数据库中存储json数据在项目开发中也经常遇到,下面我就 ...

  8. 命令行bash的基础操作

    刚进入系统在光标前面会显示这样一串字符[root@centeros ~]# root表示当前的登录用户可以通过id命令查看 centeros表当前的主机名可以通过hostname查看 ~表示当前用户的 ...

  9. How to check a not defined variable in javascript

    javascript里怎么检查一个未定义的变量? in JavaScript null is an object. There's another value for things that don' ...

  10. ls命令解析

    ls 列出目录的内容.它可是我们所经常使用的命令,那么你了解它所有的功能吗?下面让我们来看看吧! 命令格式 ls [OPTION]... [FILE]... 参数说明 -a , --all 显示所有文 ...