首页 > 代码库 > 缓存概述[1]

缓存概述[1]

Java缓存机制概述-1

一、    概述

所谓缓存就是把程序经常使用的对象读到内存中,以后使用直接从内存中读取即可。一般针对的是:数据库、硬盘中的资源读取耗费大量时间。缓存是一种典型的空间换时间的方案。

Java中使用最多的思想:key-value缓存,一般用Map实现。

1.0 缓存需要解决的问题

  • 缓存数据的存放时间问题,比如Session会设置在timeout时间;
  • 缓存数据和真实数据的同步问题,缓存中的数据可能会随着应用程序变化,那么缓存的数据就要同步会数据库中,以保持一致性;
  • 多线程并发问题,多个线程访问缓存,如何同步

 

注意:

  • 单例模式其实暗含缓存的意思,单例的目的就是控制对象数目
  • 享元模式也契合缓存,比如IntegerString等,都缓存了一些对象,其中Integer的对象[-128+127]之间是共享的,String更是共享的。
  • 有时候共享缓存可能导致死锁问题。

 

1.1    缓存分类

按照格式分类:

  • 文件缓存:把数据存储在硬盘上,不管是XML格式还是其他序列化格式等
  • 内存缓存:实现一个静态的Map,对这个Map实现增删查等操作

按照功能分类:

  • 操作系统缓存:减少磁盘机械操作
  • 数据库缓存:减少磁盘IO操作
  • 应用程序缓存:减少对数据库的操作
  • Web服务器缓存:减少应用服务器请求
  • 客户端浏览器缓存:减少对网站的访问,降低带宽

 

1.2 缓存的一般使用步骤

  • 先去缓存中查找有没有需要的资源
  • 如果没有找到,就创建一个对象,然后把该对象写回缓存中,以备下次使用
  • 如果找到了相应的数据就或创建了数据就直接使用即可
  • 注意缓存的操作要线程安全,防止增删改查冲突等

1.3 操作系统缓存

         文件系统提供了Disk Cache:操作系统会把经常访问的内容放入到内存中,由文件系统来管理。当应用程序通过文件系统访问磁盘文件时,操作系统会先从Disk Cache中读取,加快了文件读取速度。

         注意特殊的应用程序对文件系统的Disk Cache有很高的要求,会绕开文件系统的缓存,直接访问磁盘分区,自己实现Disk Cache策略。比如Oracleraw deviceMySQLInnoDBinnodb_flush_method=O_DIRECT

         查看Windows的任务管理器可以看到当前缓存的数目。

 

1.4 HTTP缓存

浏览器缓存实现一般是:如果浏览器第一次请求服务器时设定允许Cache,服务器端在给资源的同时,在响应头:Last-Modified中告诉浏览器该资源的最后修改时间和一个Etag值,同时浏览器把该资源缓存到本地,下次请求时候,请求头中:IF-None-Match携带Etag信息,然后IF-Modified-Since携带修改时间。服务器接收到之后,进行比对,如果资源没有修改过,就发304状态码,这样浏览器直接使用本地缓存即可,否则返回200状态码和新的资源以及Last-ModifiedEtag值。

 

 技术分享

 

 

1.5 对象缓存

         O/R Mapping框架例如Hibernate提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程,降低对数据库的访问请求,对象缓存适合OLTP(联机事务处理)应用,良好的数据库结构和利用对象缓存,能提供极高的性能。

         Hibernate中使用注解即可实现缓存,Hibernate会拦截对象的CRUD操作,针对对象的读取操作自动缓存,针对对象的修改操作自动清理缓存。

         OLTP类型的Web应用,由于可以进行服务器端的水平集群扩展,最终的系统瓶颈在数据库访问处,那个框架能够最大限度的降低数据库访问,降低数据库访问压力,那个框架提供的性能越佳。

 

1.6 查询缓存

 

 

 

1.7 页面缓存

 

 

1.8 分布式缓存

 

 

 

缓存概述[1]