WhirlyCache
借着最近项目用到cache,就顺便研究了一下cache 的设计,研究对象WhirlyCache 一个sun公司轻量的cache工具
作为一个cache的整体架构 他分这么几个模块
1.配置信息 包括config 文件和resource文件
Config文件 用来记录cacheManger 中需要的信息以及对每种cache 的属性记录,他的结构就是以cache 为基本单位,
..
…
而对于cache 我认为cache包括可以有一个或多个policy(cache策略)的定义,这些policy现在主要有
FIFO,LRU等等,这些多个policys组合成当前该cache的cache策略。除了主要策略 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 获取cache的size
对于数据结构来说, 最终cache应该是map这种数据结构
而WhirlyCache中 cache中的key 有两种
一种就是map 中的object
另外一种就是他独有的对象
Cacheable object
4.Cacheable 只是whirlyCache中的一个接口,他下面有三个方法的声明
OnRemove,onRetreive,onStore。这个接口表示,当你将Cacheable object
作为cache的key的话,那么在执行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 对象 一并put到managedCache,在执行cache中remove store retrieve等操作的时候同时需要更新item中的信息。当执行到某个策略的时候,首先需要根据不同的policy 实现不同的Comparator(
AddedComparator
,
CountComparator
, UsedComparator)
而这些
Comparator
的
Object
比较原则就是将前面说的
Item
的记录信息进行比较,然后将
Object
排序。
managedCache
根据相应的
Comparator
进行
Sort
。然后将
managedCache
中大于
Cache
设置大小的数据进行
remove
,这样整个过程就是performMaintenance
6.
CacheDecorator
前面的cache只是接口,其实CacheDecrator才是cache的具体实现,前面的cache只是一个interface,他定义了面向用户接口的相关行为,具体他表示对于cache而言,提供给外部人员使用的行为接口。比如用户只要关心从cache中remove,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.cac
he.Cache
接口
b.
添加关闭功能,当
ServletContext reload
的时候
具体实现
ServletContextListener