了解Ehcache

一. 简单介绍

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:类级别的注解,主要是共享缓存名称;

猜你喜欢

转载自www.cnblogs.com/bbbbs/p/12532678.html