我们在实现页面加载数据的时候,如果每次都需要从数据库中查询完数据之后再将数据回写,那么这样的开发效率是很低的,固然有时候我们可以将数据存储在域对象中,但是这也不是都可以解决问题的,这时我们利用缓存机制来非常轻松的解决这类问题。
常用的缓存机制
* EHCache:Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。
* Memcached:Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
* Redis:redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。
这里我们详细的介绍一下EHCache的用法。
在网上商城的“分类管理”中,我们通过利用EHCache缓存机制来实现对加载速度的优化。
EHCache缓存机制的使用步骤
一、引入相关EHCache的jar包。
二、在业务层建立相关数据的缓存机制
1、读取配置文件,获得EHCache缓存区中的核心对象CacheManager对象,
代码如下:
<span style="font-size:18px;">CacheManager cacheManager = CacheManager.create(CategoryServiceImpl.class.getClassLoader().getResourceAsStream("ehcache.xml"));</span>
代码解析:creat方法中需要传入一个输入流路径,但是由于是web路径,所以我们可以通过类加载器的getResourceAsStream的方法来获得配置文件的绝对路径。
2、从配置文件中获取相应名称的缓存区。
<span style="font-size:18px;">Cache cache = cacheManager.getCache("categoryCache");</span>
三、判断缓存区中是否含有相应的数据(这里以网上商城中分类数据为例)
代码如下:
<span style="font-size:18px;">// 判断缓存中是否有list集合: Element element = cache.get("list"); List<Category> list = null; if(element == null){ // 缓存中没有数据 System.out.println("缓存中没有数据 ,查询数据库====="); CategoryDao categoryDao = new CategoryDaoImpl(); list = categoryDao.findAll(); element = new Element("list",list); cache.put(element); }else{ // 缓存中已经存在数据 System.out.println("缓存中有数据 ,没有查询数据库====="); list = (List<Category>)element.getObjectValue(); } </span>
代码解析:缓存区中的元素对象Element对象是以键值对的形式存在的。
cache.get("list");是获得储存在缓冲区中的元素对象。