1.ehcache:百度百科这样解释的,EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。总的来说,他的出现就是减少对数据库的访问次数。从数据库查询出来的数据放到缓存中,以便下次调用,大大减少了 开销,性能也得到了提高。

特点:

l Java界最出名的缓存框架,主要用于单机缓存,速度很快。

l 进程级别的缓存,多个线程可共享一个缓存数据。

其实现方式如下图所示:

2.简单的解释一下ehcache的核心配置文件

  <!-- 硬盘上缓存的临时目录 -->
<diskStore path="java.io.tmpdir"/>
<!--
maxElementsInMemory:内存中最大存放的元素的个数
eternal:是否永生,默认是false
timeToIdleSeconds:发呆闲置的时间,超过该时间,被清除,单位秒
timeToLiveSeconds:存活的事件,超过该时间被清除
maxElementsOnDisk:如果内存满了,溢出到硬盘上的临时目录中的存放的元素的个数
diskExpiryThreadIntervalSeconds:轮询时间,巡视组
memoryStoreEvictionPolicy:内存对象的清理策略,如果满了,怎么办?
策略有三个:LRU、LFU、FIFO
LRU:最少使用被清理,次数
LFU:时间,闲置最长的时间
FIFO:管道策略,先进先出
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>

l 如果你的数据只是临时存放到缓存,减轻数据库压力,用默认值就很好

l 如果你的数据要在程序运行过程中一直被查询,则建议将设置为所有的元素被清除,一般用于数据字典。

3.ehcache中的缓存注解

@Cacheable和@CacheEvict来对缓存进行操作

@Cacheable:将方法的返回值放入到缓存中

@CacheEvict:负责清除缓存

4.下面与Spring整合的案列

需求:将菜单数据放入Ehcache中。

4.1.引入坐标

<!-- ehcache的缓存框架 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.10</version>
</dependency>
<!-- spring整合第三方框架的 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>

  

4.2.编写配置文件(ehcache文件)

<!-- <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
--><ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <!-- 磁盘上的缓存的临时目录 ,默认是系统的临时目录,也可以手动指定一个目录-->
<diskStore path="java.io.tmpdir"/>
<!-- 默认的缓存区域的默认策略 -->
<!--
maxElementsInMemory:内存中元素最大存放的个数
eternal:缓存的对象是否永生不死。一般都是false。
timeToIdleSeconds:发呆的时间,多长时间不用,就干掉,秒
timeToLiveSeconds:存活的时间,活够了就干掉,秒
maxElementsOnDisk:硬盘上最大存放的元素的个数,如果内存10000个满了,就往硬盘上存。
memoryStoreEvictionPolicy:内存中存储和销毁元素的策略:默认使用LRU,解决的是缓存元素满了怎么办。
策略有三个:LRU、LFU、FIFO
LRU:最少使用被清理,次数
LFU:时间,闲置最长的时间
FIFO:管道策略,先进先出
-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- Spring整合的菜单缓存 -->
<cache name="bos_menu_cache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</cache>

  

4.3.Spring整合encache配置文件(需要引入ehcache文件)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- 配置ehcache的对象EhCacheManager -->
<bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<!-- 注入ehcache核心配置文件的位置 可以不配置,默认找类路径下的ehcache.xml -->
<property name="configLocation" value="classpath:ehcache.xml" />
</bean>
<!-- Spring整合Ehache -->
<!-- Spring的平台缓存管理器 -->
<bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
<!-- 注入ehcache的对象 -->
<property name="cacheManager" ref="ehCacheManager"></property>
</bean>
<!-- spring的缓存注解驱动 -->
<cache:annotation-driven cache-manager ="springCacheManager" />
</beans>

  

4.4.在需要操作缓存数据的方法上添加注解

package cn.bos.service.impl.system;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import cn.bos.dao.system.MenuRepository;
import cn.bos.domain.system.Menu;
import cn.bos.domain.system.User;
import cn.bos.service.system.MenuService; @Service("menuService")
@Transactional
public class MenuServiceImpl implements MenuService{ @Autowired
private MenuRepository menuRepository; @Override
public List<Menu> menu_list() { return menuRepository.findAll();
} @Override
//清除所有的缓存
@CacheEvict(value="bos_menu_cache",allEntries=true)
public void menu_add(Menu model) { if(model.getParentMenu()!=null&&model.getParentMenu().getId()==null){
model.setParentMenu(null);
} menuRepository.save(model);
} @Override
//@Cacheable(value="bos_menu_cache")方法的结果放到缓存中
// 使用用户的标号作为缓存的key
@Cacheable(value="bos_menu_cache",key="#user.id")
public List<Menu> findMenuByUser(User user) {
// 管理员 所有菜单
if("admin".equalsIgnoreCase(user.getUsername())){
return menuRepository.findByOrderByPriority();
}else{
// 普通用户(显示部分菜单)
return menuRepository.findByUser(user);
}
}
}

  

注意:实体类中的序列化问题:

序列化的id,用来作为序列化和反序列化的唯一标识,默认的值是根据类的内容计算出来,如果类的内容发生变化,则值会变,例如:反序列化之前,将类改变内容了,那么反序列化将会失败。因此,为了保障反序列化成功,一般将该id的值定死!(随机数)

ehcache的基本使用及Spring整合的更多相关文章

  1. Spring整合Ehcache管理缓存

    前言 Ehcache 是一个成熟的缓存框架,你可以直接使用它来管理你的缓存. Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现.它 ...

  2. Spring整合Ehcache管理缓存(转)

    目录 前言 概述 安装 Ehcache的使用 HelloWorld范例 Ehcache基本操作 创建CacheManager 添加缓存 删除缓存 实现基本缓存操作 缓存配置 xml方式 API方式 S ...

  3. Ehcache和Spring整合

    Ehcache是使用Java编写的缓存框架,比较常用的是,整合在Hibernate和MyBatis这种关系型数据库持久框架. 不过现在用NoSQL也比较盛行,要应用Ehcache,整合起来就没法按照那 ...

  4. Spring整合EHCache框架

    在Spring中使用缓存可以有效地避免不断地获取相同数据,重复地访问数据库,导致程序性能恶化. 在Spring中已经定义了缓存的CacheManager和Cache接口,只需要实例化便可使用. Spr ...

  5. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...

  6. Spring整合EhCache详解

    一.EhCache介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开 源Java分布 ...

  7. 以Spring整合EhCache为例从根本上了解Spring缓存这件事(转)

    前两节"Spring缓存抽象"和"基于注解驱动的缓存"是为了更加清晰的了解Spring缓存机制,整合任何一个缓存实现或者叫缓存供应商都应该了解并清楚前两节,如果 ...

  8. spring整合ehcache实现缓存

    Spring 提供了对缓存功能的抽象:即允许绑定不同的缓存解决方案(如Ehcache),但本身不直接提供缓存功能的实现.它支持注解方式使用缓存,非常方便. spring本身内置了对Cache的支持,之 ...

  9. Spring整合Shiro做权限控制模块详细案例分析

    1.引入Shiro的Maven依赖 <!-- Spring 整合Shiro需要的依赖 --> <dependency> <groupId>org.apache.sh ...

随机推荐

  1. nodejs模块引用

    模块的引用是后端语言非常重要的一部分,那么在nodejs中,如何做到这一点呢. 在引用其他模块时,常用的就是两种方法:exports,module.exports. 接下来,我们写一个demo来分辨其 ...

  2. Ipython的安装/ipython notebook的简单使用

    安装了pyhton的windows版的shell好久了,今天才听说Ipython这个东西,确实在windows下的python shell很难用,一旦输入错误就要重新来过 了解了下ipython,然后 ...

  3. MySQL--pt-osc工具学习

    ##=====================================================##pt-osc之工作流程:1.检查更改表是否有主键或唯一索引,是否有触发器2.检查修改表 ...

  4. substr与substring的用法

    substr substr() 方法返回一个字符串中从指定位置开始到指定字符数的字符. 语法 str.substr(start[, length]) 参数 strat 开始提取字符的位置.如果为负值, ...

  5. 【OS】NMON的简介和使用

    [OS]NMON的简介和使用 目前NMON已开源,以sourceforge为根据地,网址是http://nmon.sourceforge.net. 1. 目的 本文介绍操作系统监控工具Nmon的概念. ...

  6. IIS 加载 JSON 错误 404 解决办法

    MIME设置:在IIS的站点属性的HTTP头设置里,选MIME 映射中点击”文件类型”-”新类型”,添加一个文件类型:关联扩展名:*.json内容类型(MIME):application/x-java ...

  7. BZOJ 3881: [Coci2015]Divljak [AC自动机 树链的并]

    3881: [Coci2015]Divljak 题意:添加新文本串,询问某个模式串在多少种文本串里出现过 模式串建AC自动机,考虑添加一个文本串,走到的节点记录下来求树链的并 方法是按dfs序排序去重 ...

  8. 香甜的黄油 Sweet Butter

    原题链接:https://www.luogu.org/problem/show?pid=1828#sub 经典的最短路问题. 各位不要被题目条件迷惑了,牧场想象成点,道路想象成边,奶牛所在的位置想象成 ...

  9. Markdown 安装图解(破解汉化教程)

    http://blog.csdn.net/taokai_110/article/details/72934818 终于解决了问题

  10. 使用TransactionScope(轻量级事务)实现数据库操作事务

    TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间.它的用途是为数据库访问提供了一个"轻量级"[区别于:SqlTransaction]的 ...