首页 > 代码库 > 缓存概述[1]
缓存概述[1]
Java缓存机制概述-1
一、 概述
所谓缓存就是把程序经常使用的对象读到内存中,以后使用直接从内存中读取即可。一般针对的是:数据库、硬盘中的资源读取耗费大量时间。缓存是一种典型的空间换时间的方案。
Java中使用最多的思想:key-value缓存,一般用Map实现。
1.0 缓存需要解决的问题
- 缓存数据的存放时间问题,比如Session会设置在timeout时间;
- 缓存数据和真实数据的同步问题,缓存中的数据可能会随着应用程序变化,那么缓存的数据就要同步会数据库中,以保持一致性;
- 多线程并发问题,多个线程访问缓存,如何同步
注意:
- 单例模式其实暗含缓存的意思,单例的目的就是控制对象数目
- 享元模式也契合缓存,比如Integer、String等,都缓存了一些对象,其中Integer的对象[-128,+127]之间是共享的,String更是共享的。
- 有时候共享缓存可能导致死锁问题。
1.1 缓存分类
按照格式分类:
- 文件缓存:把数据存储在硬盘上,不管是XML格式还是其他序列化格式等
- 内存缓存:实现一个静态的Map,对这个Map实现增删查等操作
按照功能分类:
- 操作系统缓存:减少磁盘机械操作
- 数据库缓存:减少磁盘IO操作
- 应用程序缓存:减少对数据库的操作
- Web服务器缓存:减少应用服务器请求
- 客户端浏览器缓存:减少对网站的访问,降低带宽
1.2 缓存的一般使用步骤
- 先去缓存中查找有没有需要的资源
- 如果没有找到,就创建一个对象,然后把该对象写回缓存中,以备下次使用
- 如果找到了相应的数据就或创建了数据就直接使用即可
- 注意缓存的操作要线程安全,防止增删改查冲突等
1.3 操作系统缓存
文件系统提供了Disk Cache:操作系统会把经常访问的内容放入到内存中,由文件系统来管理。当应用程序通过文件系统访问磁盘文件时,操作系统会先从Disk Cache中读取,加快了文件读取速度。
注意特殊的应用程序对文件系统的Disk Cache有很高的要求,会绕开文件系统的缓存,直接访问磁盘分区,自己实现Disk Cache策略。比如Oracle的raw device和MySQL的InnoDB:innodb_flush_method=O_DIRECT。
查看Windows的任务管理器可以看到当前缓存的数目。
1.4 HTTP缓存
浏览器缓存实现一般是:如果浏览器第一次请求服务器时设定允许Cache,服务器端在给资源的同时,在响应头:Last-Modified中告诉浏览器该资源的最后修改时间和一个Etag值,同时浏览器把该资源缓存到本地,下次请求时候,请求头中:IF-None-Match携带Etag信息,然后IF-Modified-Since携带修改时间。服务器接收到之后,进行比对,如果资源没有修改过,就发304状态码,这样浏览器直接使用本地缓存即可,否则返回200状态码和新的资源以及Last-Modified、Etag值。
1.5 对象缓存
由O/R Mapping框架例如Hibernate提供,透明性访问,细颗粒度缓存数据库查询结果,无需业务代码显式编程,降低对数据库的访问请求,对象缓存适合OLTP(联机事务处理)应用,良好的数据库结构和利用对象缓存,能提供极高的性能。
Hibernate中使用注解即可实现缓存,Hibernate会拦截对象的CRUD操作,针对对象的读取操作自动缓存,针对对象的修改操作自动清理缓存。
OLTP类型的Web应用,由于可以进行服务器端的水平集群扩展,最终的系统瓶颈在数据库访问处,那个框架能够最大限度的降低数据库访问,降低数据库访问压力,那个框架提供的性能越佳。
1.6 查询缓存
1.7 页面缓存
1.8 分布式缓存
缓存概述[1]