Ehcache(四): net.sf.ehcache.Cache类代表个啥?
注: 跟笔者其它研究源码的博客一样, Ehcache系列也是基于一个例子来debug地跟踪, 例子详见Ehcache(一): Spring + Ehcache开场白中的附件.如果没有例子作参照,阅读过程中可能有些摸不着头绪.
------------------------------???
?? ?Ehcache(三): Cache实例的get与set中, 我们看到一个Cache实例从CacheManager中get了出来,并又set给了MethodCacheInterceptor. 那么不禁要问: 这个get/set的Cache实例代表什么信息?
??? 家谱
??? 本着尽可能多地吸收开源项目精华的原则, 我们还是来看Cache类的家谱. 在Eclipse中F4后,我们得到了如下所示的继承/实现关系.
如图所示, Cache类现了Ehcache接口. 再看Ehcache接口又有什么特性呢?Ehcache接口里有定义了很多方法,不过我们这里只关注现在要用到的: get,put,remove.这几个方法也折射出Cache的实质:把数据放到缓存中, 从缓存中取出数据和从缓存中删除掉不再有意义的数据.
??? 上面我们从最根上看出Cache是Ehcache中存放数据的Cell,那么为了实现Ehcache接口中定义的方法(也即缓存的基本功能),这个Cache类又依赖什么或又有什么辅助属性呢? 我们看到有这样的属性:
??? 1, 真正存放数据的地方: diskStore(net.sf.ehcache.store.Store类型) , memoryStore(net.sf.ehcache.store.MemoryStore类型).
??? 2, 与命中与否相关的统计信息:? hitCount,memoryStoreHitCount,diskStoreHitCount,missCountNotFound,missCountExpired
??? 3, 与事件相关的监听: registeredEventListeners.
???
??? 何时创建/创建时用到什么信息?
?? ?? ?Ehcache(三): Cache实例的get与set中我们顺藤摸瓜地看到一个Cache实例是在(或者说可以在)ConfigurationHelper类的createCache(CacheConfiguration cacheConfiguration)方法创建出来. 方法中我们看到了如下代码:
?? ???? Cache cache = new Cache(cacheConfiguration.name,
??????????????? cacheConfiguration.maxElementsInMemory,
??????????????? cacheConfiguration.memoryStoreEvictionPolicy,
??????????????? cacheConfiguration.overflowToDisk,
??????????????? getDiskStorePath(),
??????????????? cacheConfiguration.eternal,
??????????????? cacheConfiguration.timeToLiveSeconds,
??????????????? cacheConfiguration.timeToIdleSeconds,
??????????????? cacheConfiguration.diskPersistent,
??????????????? cacheConfiguration.diskExpiryThreadIntervalSeconds,
??????????????? null,
??????????????? null,
??????????????? cacheConfiguration.maxElementsOnDisk,
??????????????? cacheConfiguration.diskSpoolBufferSizeMB);
??? 构造方法中绝大多数地用到了cacheConfiguration实例, 写到这里相信大家也都能看出来了: 一个Cache对象对应着ehcache.xml配置文件中一个<cache>标签. 也即如下的配置信息:
?? ???? <cache name="com.rmn190.MethodCache"
??????????? maxElementsInMemory="10"
??????????? eternal="false"
??????????? timeToIdleSeconds="200"
??????????? timeToLiveSeconds="300"
??????????? overflowToDisk="true"
??????????? />
??? 也就是说,一个Cache对象对应着Ehcache项目在内存或磁盘里根据<cache>标签里信息划分出来的一个存储空间,为了使用上的方便,给这存储空间起了个名字,即<cache>标签中的name信息.