一. 简单介绍
1. 一个用Java实现的使用简单,高速,线程安全的缓存管理类库;
2. 从Hibernate发展而来,涵盖了其全部功能;
3. 最快速的Java缓存之一,可用于大型高并发系统,API易于使用;
4. 支持LRU,LFU和FIFO等多种缓存策略;
5. 缓存数据有两级:内存和磁盘,无须担心容量问题;
6. 缓存数据会在虚拟机重启的过程中写入磁盘;
7. 可通过RMI,可插入API等方式进行分布式缓存;
8. 具有侦听接口:缓存管理器监听器 CacheManagerEventListener 和 缓存事件监听器 CacheEventListener;
二. 使用介绍
1. 一个应用可以有多个CacheManager,一个CacheManager可以有多个Cache,一个Cache内部保存很多个Element,一个Element中保存的是一个key/value配对;
2. 主要架构
Cache Replication: 负责缓存同步的几种实现,主要包括TerraCotta,RMI,JMS和JGroup四种;
In-Process APIS:对外常用的API,包括JRuby,Hibernate,JMX,SOAP API,Cache Server五种;
Network APIS:通信协议,主要有RESTful API,SOAP API和JMX API等;
Ehcache Core:包括CacheManager缓存管理器,Cache,Element,可以取到真实数据的组件SOR;
3. 缓存策略
FIFO:根据数据的写入时间,先进先出;
LUF:最少被使用,缓存的元素有一个hit属性,hit值最小的将被清除;
LRU:最近最少使用,现有缓存元素中时间戳离当前时间最远的元素将被清除;
4. 配置文件ehcache.xml
name:Cache的唯一标识;
maxElementsInMemory:内存中最大缓存对象数;
maxElementsOnDisk:磁盘中最大缓存对象数,0表示无穷大;
eternal:Element是否永久有效,设置后timeout将失效;
overflowToDisk:当内存中Element数量达到最大时写入磁盘;
timeToIdleSeconds:设置Element在失效前的允许闲置时间;
timeToLiveSeconds:设置Element在失效前的允许存活时间;
diskPersistent:是否将缓存数据持久化在磁盘上,默认false;
disExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认120s;
diskSpoolBufferSizeMB:设置磁盘缓存区大小,默认30MB;
memoryStoreEvicitionPolicy:当Element达到限制时将会根据指定策略清理内存;
5. 简单代码
CacheManager cacheManager = CacheManager.creat(); // 以默认配置通过create方法创建实例 Element element = new Element(key, value); // 需要缓存的数据 Cache cache = cacheManager.getCache(cacheName); // cacheName值配置文件中的缓存名称 cache.put(element); // 将数据存入缓存中 element = cache.get(key); // 从缓存中获取数据 Object data = element.getObjectValue(); // 获取到的缓存数据 cache.remove("key"); // 通过key删除缓存 cache.replace(new Element("key", "value2")); // 替换原有key的value
6. 结合spring
@Cacheable:加了这个注解的方法表示可以缓存,第一次调用该方法时将缓存结果,再访问将直接返回缓存结果,不执行方法中的代码;
属性:value 必须指定至少一个,值是配置文件中的cache的name;
key 按照SpEL表达式编写,如果为空则组合参数;
condition 可以为空,否则按照SpEL表达式编写,只有为true时进行缓存;
@CachePut:该注解支持的属性和方法与@Cacheable一致,但是使用时不仅缓存执行结果,还是真实的执行方法;
属性:value;key;condition;
@CacheEvict:清空缓存
属性:value;key;condition;
allEntries:是否清空所有缓存内容,缺省为false,如果指定为true,则方法调用后将立即清空所有缓存;
beforeInvocation:释放在方法执行前清空,缺省为false;
@CacheConfig:类级别的注解,主要是共享缓存名称;