Ehcache可以对页面、对象、数据进行缓存,同时支持集群/分布式缓存。在应用中用于常常需要读取的数据交换,而不是通过DB DAO数据交换(cache不占用DB宝贵的NIO,直接交换堆内存)。
整合Spring、Hibernate也非常的简单,Spring对Ehcache的支持也非常好。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache。
从Spring3.1开始添加了对缓存的支持。
Maven的依赖:
net.sf.ehcache ehcache 2.9.0 ch.qos.logback logback-classic 1.0.13 org.springframework spring-context 4.1.4.RELEASE org.springframework spring-context-support 4.1.4.RELEASE
Gradle的依赖:
apply plugin: 'java'apply plugin: 'eclipse-wtp'version = '1.0'// Uses JDK 7sourceCompatibility = 1.7targetCompatibility = 1.7// Get dependencies from Maven central repositoryrepositories { mavenCentral()}//Project dependenciesdependencies { compile 'org.springframework:spring-context:4.1.4.RELEASE' compile 'org.springframework:spring-context-support:4.1.4.RELEASE' compile 'net.sf.ehcache:ehcache:2.9.0' compile 'ch.qos.logback:logback-classic:1.0.13'}
spring-config-cache.xml:
ehcache.xml:
参数说明:
name: cache的名称,必填。 maxEntriesLocalHeap: 在内存中的最大保存对象数量,0则不限,如果填必须小于Integer.MAX_SIZE (2147483647)。 maxEntriesLocalDisk: 磁盘中保存的数量,0则不限,一般填0。 eternal: true:对象永不过期。false:对象有过期时限。 以下为选填: maxEntriesInCache: 只在分布式环境使用,集群节点中的最大数量,0则不限 overflowToOffHeap: 企业版Ehcache才有的功能,用于java off-heap(off-heap允许Java直接操作内存空间),这样的目的是为了节省宝贵的jvm堆,又避免磁盘存储的低速。 maxBytesLocalHeap: 定义缓存可以从VM的堆中使用多少字节,如果定义这个则不能再定义maxEntriesLocalHeap。 maxBytesLocalOffHeap: 定义缓存可以从OffHeap中使用多少字节 maxBytesLocalDisk: 定义缓存可以从磁盘中使用多少OffHeap字节 timeToIdleSeconds: 对象空闲过期时间,以秒为单位,如果是0则不过期。只对eternal为false的有效。 timeToLiveSeconds: 对象生存时间,一般为0,为永久生存。只对eternal为false的有效。 上边的两个配置容易混淆,区别: timeToLiveSeconds=x:缓存自创建日期起至失效时的间隔时间x;对象空闲时间,指对象在多长时间没有被访问就会失效。 timeToIdleSeconds=y:缓存创建以后,最后一次访问缓存的日期至失效之时的时间间隔y; diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。 diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。 memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。 clearOnFlush: flush()的时候清除内存。 persistence sub-element. 持久化策略,这是子属性,一般不用设置。 * localRestartable - 可以重用的缓存,持久化在磁盘,只有企业版才有这个功能. * localTempSwap - 当(on-heap and/or off-heap)满的时候保存到磁盘,但并不重用持久化,即进程结束则缓存全部清除。 * none - 不持久化
使用
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.Cache;import org.springframework.cache.CacheManager;import org.springframework.stereotype.Service;......private Cache cache;...... public void addObjToCache(Object key, Object value) { cache.put(key, value); } public String getValueByCache(String key) { return (String)cache.get(key).get(); }......