使用ehcache缓存进行优化
上面的操作我们已经可以在每个页面上查看到分类信息了,但是只要切换一次页面就会查询一下数据库,增加服务器的压力,对于数据不经常变化的情况,我们可以使用缓存技术(缓存是放在内存中,当需要使用的时候从缓存中查找,如果有则直接返回,如果没有再去数据库中查询)。
常见的缓存技术:
- ehcache
- memcache
- redis
这里我们使用ehcache,hibernate中底层就使用了ehcache,实际开发中redis使用率较高,效果更高。
ehcache使用步骤:
- 导入jar包
- 编写配置文件
- 使用API(获取数据先从缓存中获取,若获取的值为空,再去查询数据库,将数据放入缓存中)
1)导入jar包和配置文件
① jar包
② 把ehcache.xml导入到src下
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="C:/ehcache"/>
<!--
默认缓存配置,
以下属性是必须的:
name :cache的标识符,在一个CacheManager中必须唯一。
maxElementsInMemory : 在内存中缓存的element的最大数目。
maxElementsOnDisk : 在磁盘上缓存的element的最大数目。
eternal : 设定缓存的elements是否有有效期。如果为true,timeouts属性被忽略。
overflowToDisk : 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上。
以下属性是可选的:
timeToIdleSeconds : 缓存element在过期前的空闲时间。
timeToLiveSeconds : 缓存element的有效生命期。
diskPersistent : 在VM重启的时候是否持久化磁盘缓存,默认是false。
diskExpiryThreadIntervalSeconds : 磁盘缓存的清理线程运行间隔,默认是120秒.
memoryStoreEvictionPolicy : 当内存缓存达到最大,有新的element加入的时候,
移除缓存中element的策略。默认是LRU,可选的有LFU和FIFO
-->
<cache
name="categoryCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
ehcache缓存的3种清空策略:
- FIFO,先进先出
- LFU,最少被使用,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
- LRU,最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
2)在service业务层完成
@Override
public List<Category> findAll() throws Exception{
//1、创建缓存管理器
CacheManager cm=CacheManager.create(CategoryServiceImpl.class.getClassLoader().getResourceAsStream("ehcache.xml"));
//2、获取指定的缓存
Cache cache=cm.getCache("categoryCache");
//3、通过缓存获取数据
Element element=cache.get("clist");
List<Category> list=null;
//4、判断数据
if(element==null) {
//从数据库中获取
list=categoryDao.findAll();
//将list放入缓存
cache.put(new Element("clist",list));
System.out.println("缓存中没有数据,已从数据库中获取");
}else {
//直接返回
list=(List<Category>) element.getObjectValue();
System.out.println("缓存中有数据");
}
return list;
}
3)测试
先点击首页,查看后台:
在点击登录,查看后台: