EhCache小结

一:接口和类的作用:

Elemenet:
key
value
lastAccessTime
hitCount
等描述cache中元素的信息。

Store: 实际上存放Element的对象,Cache针对对象的操作一般都委托Store对象。

- MemoryStore: 继承该类来实现自定义MemoryStore。该类存放数据时,先使用Map存放数据,然后再判断是否超出容量。
put()
doPut() // 用来清理元素
-LruMemoryStore.java 使用 LinkedHashMap的子类,doput()为空,因为该map的实现中的removeEldestEntry方法清理了超出容量的元素。
-LfuMemoryStore.java 使用HashMap
-FifoMemoryStore.java 使用LinkedHashMap 这里用队列应该更快吧??源码中还需要遍历map。

-DiskStore:
其实diskStore也是用一个hashmap来存放数据,只有显式的调用flush()方法的时候才判断是否要将元素写入文件中。


CacheManager 来管理 Cache ;
Cache用来操作Element,Cache是抽象出来的逻辑概念,其 内部使用Store来处理Element
Element就是数据描述缓存对象的基本信息。
Store是保管缓存对象的仓库,这个仓库分Memory和Disk两种。


EHCache中的EventListener是针对分布式的,普通的应用可以不用考虑。

二:一些功能细节:

1:超出设定的元素容量的解决方法
MemoryStore:
When an element is added to a cache and it goes beyond its maximum memory size,
an existing element is either deleted, if overflowToDisk is false, or evaluated for spooling to disk,
if overflowToDisk is true. In the latter case, a check for expiry is carried out. If it is expired it is deleted; if not it is spooled.
判断元素是否过期,MemoryStore有3种策略可选,LRU,LFU,FIFO,默认为LRU。


DiskStore:
使用LFU,DiskStore使用一个守护线程,DiskStore.SpoolAndExpiryThread内部类来定时检查diskStore中的元素,
定时刷新到文件中,如果遇到过期的元素则移除。

2:元素存活时间到期
MemoryStore:
在get()和超出容量的时候才判断是否过期
DiskStore:
只有在flush的时候才判断是否过期,如果过期则移除。

也就是说,这两种方式,不论在文件或者内存中,都会依然存在过期的元素,
这些元算可能永远存在,但不影响我们的操作,因为我们get()或者超出容量的时候都会判断是否过期并清除。

三:初始化
CacheManager cacheManager = new CacheManager();

调用protected void init(Configuration configuration, String configurationFileName, URL configurationURL, InputStream configurationInputStream) 方法进行初始化。
1:解析配置信息:
1.1 查找ehcache.xml文件,如果找不到则使用默认的ehcache-failsafe.xml,返回一个URL对象。
1.2 调用ConfigurationFactory.parseConfiguration(input) 方法来进行解析。返回Configuration对象。
Configuration的数据结构:
private DiskStoreConfiguration diskStoreConfiguration;
private CacheConfiguration defaultCacheConfiguration;
private List<FactoryConfiguration> cacheManagerPeerProviderFactoryConfiguration = new ArrayList<FactoryConfiguration>();
private List<FactoryConfiguration> cacheManagerPeerListenerFactoryConfiguration = new ArrayList<FactoryConfiguration>();
private FactoryConfiguration cacheManagerEventListenerFactoryConfiguration;
private final Map cacheConfigurations = new HashMap();
private String configurationSource;

该数据结构是针对xml定义来的,其中最复杂也最常用的算是CacheConfiguration,其内部结构也很简单。
cacheConfigurations存放多个CacheConfiguration。

2:根据Configuration进行CacheManager,Cache,Store等数据结构的初始化。

总结:
EHCache是一款比较简单的开源缓存产品,但也存在一些不足之处:
比如:
1:CacheManager和Cache这个具体类耦合,当然也提供了针对EHCache接口的方法,如果使用自定义的Cache的话容易混淆方法。
2:针对不同的Cache类,我们希望指定不同的MemoryStore实现、DiskStore实现,EHCache只提供了通过程序来达到这一功能,
没有提供通过配置文件来提供(类似于Hibernate配置文件中CacheProvider,JDBC dialect 等)。
3:有些算法实现得不算好,比如FifoMemoryStore.java中的清理元素算法选择的数据结构不够快速。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值