linugb118--java space

Java

WhirlyCache

 

                                                                 WhirlyCache

借着最近项目用到cache,就顺便研究了一下cache 的设计,研究对象WhirlyCache 一个sun公司轻量的cache工具

作为一个cache的整体架构 他分这么几个模块

1.配置信息 包括config 文件和resource文件

Config文件 用来记录cacheManger 中需要的信息以及对每种cache 的属性记录,他的结构就是以cache 为基本单位,

<whirlyCache>

<cache>..</cache>

<cache>…</cache>

</whirlyCache>

而对于cache 我认为cache包括可以有一个或多个policycache策略)的定义,这些policy现在主要有FIFO,LRU等等,这些多个policys组合成当前该cachecache策略。除了主要策略 cache 还可以定义其他属性。

cacheConfig对象与config文件中的cache 声明可以认为是一一对应的

2.CacheManager cache管理器是cache功能中不可缺少的,和其他管理一样,通常cache管理器是singleton模式,他的功能如下:

A. load config文件, config文件load到内存,将每个cache信息set到对应的cacheconfig

B. create cache 根据前面load config,根据不同的cacheconfig创建不同的cache,其中包括policy

C.destroy 可以对manager中某个指定的cache进行destroy或者destroy 所有的cache

D.getCache 通过指定的name来获取缓存对象

E.shutdown Whirlycache 他实现的其实是 destroy all caches 的功能, 我认为shutdown 应该是destroy all data in cachemanger的功能,包括unload config file

CacheManager的数据结构:

主要有两个Map 用来存放数据

一个是configMap load config之后,存放多个cacheConfig

另一个是caches 用于存放不同的cache。、

3.Cache 接口

Cache 应该具有如下功能

A. store cache中存放需要存放的对象

B.retrieve cache中获取需要的对象

C.remove 清除cache中的某个对象

D.size 获取cachesize

对于数据结构来说, 最终cache应该是map这种数据结构

WhirlyCache cache中的key 有两种

一种就是map 中的object

另外一种就是他独有的对象 Cacheable object

4.Cacheable 只是whirlyCache中的一个接口,他下面有三个方法的声明

OnRemoveonRetreiveonStore。这个接口表示,当你将Cacheable object

作为cachekey的话,那么在执行cache中的remove,retrieve,store 三个操作

的时候,他同时调用cacheable中对于的onXXX方法。我们可以认为这个是Listener

当做Store的操作时候,如果put key cacheable 也就对于调用Cacheable onStore方法,那么实现onStore 就能在store 触发器事件。

5.CachePolicy

所谓CachePolicy 就是cache的策略,那么他与ManagerCache 有关,需要为该Policy指定ManagerCache,  所以就有SetManagedCache(), 而某个Policy的属性是在配置文件中指定的,所以就有了SetConfig(). 那么有混淆的就是Cache ManagedCache, 其实他们的区别在于一个是行为声明, 一个是具体的数据结构,后面会具体分析,而这里需要说明他们和Policy的关系不同的是,cache 中应该是可以有多个policy,他是面向用户的,用户通常说的“我为某个Cache 指定了这么几个策略组合” 那么这里的cache 就是指的Cache。而对于ManagedCache 他其实就是有个map实体,那么具体policy 的实现就是对该map的操作,比如FIFO 那么就要对这个map实行 FIFO的操作。

下面还有一个方法是Policy interface 必须声明的,那就是 performMaintenance(), 他就是具体执行该策略。Whirly 提供了下面几种CachePolicy:

a. FIFO   先进先出策略

b. LFU Least Frequently Used algorithm

c.LRU least recently used algorithm

Policy的机制:

首先需要一个Item对象, 他记录被引用的object最近被使用,最近用的,以及被使用的记录数等相关信息,在store的时候New 一个item 对象 一并putmanagedCache,在执行cacheremove store retrieve等操作的时候同时需要更新item中的信息。当执行到某个策略的时候,首先需要根据不同的policy 实现不同的Comparator( AddedComparatorCountComparator, UsedComparator) 而这些ComparatorObject比较原则就是将前面说的Item的记录信息进行比较,然后将Object排序。managedCache 根据相应的Comparator进行Sort。然后将managedCache中大于Cache设置大小的数据进行remove,这样整个过程就是performMaintenance

6. CacheDecorator

前面的cache只是接口,其实CacheDecrator才是cache的具体实现,前面的cache只是一个interface,他定义了面向用户接口的相关行为,具体他表示对于cache而言,提供给外部人员使用的行为接口。比如用户只要关心从cacheremove,retrieve object的这样的逻辑行为。而对于内部数据结构方面的具体操作,用户并不关心。为了清晰我们需要另外独立定义接口。这样我们定义了ManagedCache接口,他继承map  interface。同时可以在该接口中定义其他数据操作的方法。

AbstractMapBackedCache是实现ManagedCache的抽象类,到这里就需要引入具体的数据结构,所以AbstractMapBackedCache中有个 map field。而具体ManagedCache中的方法的实现,也是对该map 变量的操作。

下面我们讲讲题外话:

对于map type java世界中有很多种,有jdk里面的HashMap TreeMap 这些我们都比较熟悉,我们可以认为这些Map classic map而今天我们在WhirlyCache中看见了其他几个map 有的我也看到过 有的也是第一次。

ConcurrentHashMap

来源:

http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html

FastHashMapImpl

来源:

org.apache.commons.collections.FastHashMap

他是apache commons项目中collections的一个Map

SynchronizedHashMapImpl:

Collections.synchronizedMap( new HashMap())

他表示该HashMap synchronized,该Map保证了该对象任何时候的一致性

通过继承AbstractMapBackedCache,为他的map field设置不同的map,就实现不同的cache策略,这个策略有别与前面的policy,前面的是算法的策略,这里应该是数据结构的策略。

7.其他

a.实现对Hibernate Cache的控制 ,实现net.sf.hibernate.cache.Cache接口

b.添加关闭功能,当ServletContext reload的时候具体实现ServletContextListener

posted on 2007-10-31 10:24 linugb118 阅读(1396) 评论(1)  编辑  收藏

Feedback

# re: WhirlyCache [未登录] 2008-01-24 10:28 linugb118

他的缺陷是 他设置的缓存大小其实是存储object的多少 而不是实际的内存大小 因此如果object 很大并且设置的缓存大小也很大 会出现内存溢出的问题   回复  更多评论   



只有注册用户登录后才能发表评论。


网站导航:
 

My Links

Blog Stats

常用链接

留言簿(1)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜