EhCache小结

Posted on

EhCache小结 - - ITeye技术网站

首页 资讯 精华 论坛 问答 博客 专栏 群组 更多 ▼

招聘 搜索

您还未登录 ! 登录 注册

nanguocoffee

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 cacheManagerPeerProviderFactoryConfiguration = new ArrayList(); private List cacheManagerPeerListenerFactoryConfiguration = new ArrayList(); 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中的清理元素算法选择的数据结构不够快速。 分享到:

JForum源码学习研究1-起步 | EhCache入门

评论

发表评论

您还没有登录,请您登录后再发表评论

NanguoCoffee的博客

NanguoCoffee

  • 浏览: 10206 次
  • 性别: Icon_minigender_1
  • 来自: 北京
  • 最近访客 更多访客>>

bingki的博客

bingki

Turandot的博客

Turandot dylinshi126的博客

dylinshi126

luwies的博客

luwies

文章分类

存档分类

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途
本文链接: EhCache小结