WhirlyCache
WhirlyCache
借著最近項(xiàng)目用到cache,就順便研究了一下cache 的設(shè)計(jì),研究對(duì)象WhirlyCache 一個(gè)sun公司輕量的cache工具
作為一個(gè)cache的整體架構(gòu) 他分這么幾個(gè)模塊
1.配置信息 包括config 文件和resource文件
Config文件 用來記錄cacheManger 中需要的信息以及對(duì)每種cache 的屬性記錄,他的結(jié)構(gòu)就是以cache 為基本單位,
<whirlyCache>
<cache>..</cache>
<cache>…</cache>
</whirlyCache>
而對(duì)于cache 我認(rèn)為cache包括可以有一個(gè)或多個(gè)policy(cache策略)的定義,這些policy現(xiàn)在主要有FIFO,LRU等等,這些多個(gè)policys組合成當(dāng)前該cache的cache策略。除了主要策略 cache 還可以定義其他屬性。
cacheConfig對(duì)象與config文件中的cache 聲明可以認(rèn)為是一一對(duì)應(yīng)的
2.CacheManager cache管理器是cache功能中不可缺少的,和其他管理一樣,通常cache管理器是singleton模式,他的功能如下:
A. load config文件, 將config文件load到內(nèi)存,將每個(gè)cache信息set到對(duì)應(yīng)的cacheconfig中
B. create cache 根據(jù)前面load config,根據(jù)不同的cacheconfig創(chuàng)建不同的cache,其中包括policy。
C.destroy 可以對(duì)manager中某個(gè)指定的cache進(jìn)行destroy或者destroy 所有的cache
D.getCache 通過指定的name來獲取緩存對(duì)象
E.shutdown 在Whirlycache中 他實(shí)現(xiàn)的其實(shí)是 destroy all caches 的功能, 我認(rèn)為shutdown 應(yīng)該是destroy all data in cachemanger的功能,包括unload config file
CacheManager的數(shù)據(jù)結(jié)構(gòu):
主要有兩個(gè)Map 用來存放數(shù)據(jù)
一個(gè)是configMap 在load config之后,存放多個(gè)cacheConfig
另一個(gè)是caches 用于存放不同的cache。、
3.Cache 接口
Cache 應(yīng)該具有如下功能
A. store 在cache中存放需要存放的對(duì)象
B.retrieve 在cache中獲取需要的對(duì)象
C.remove 清除cache中的某個(gè)對(duì)象
D.size 獲取cache的size
對(duì)于數(shù)據(jù)結(jié)構(gòu)來說, 最終cache應(yīng)該是map這種數(shù)據(jù)結(jié)構(gòu)
而WhirlyCache中 cache中的key 有兩種
一種就是map 中的object
另外一種就是他獨(dú)有的對(duì)象 Cacheable object
4.Cacheable 只是whirlyCache中的一個(gè)接口,他下面有三個(gè)方法的聲明
OnRemove,onRetreive,onStore。這個(gè)接口表示,當(dāng)你將Cacheable object
作為cache的key的話,那么在執(zhí)行cache中的remove,retrieve,store 三個(gè)操作
的時(shí)候,他同時(shí)調(diào)用cacheable中對(duì)于的onXXX方法。我們可以認(rèn)為這個(gè)是Listener,
當(dāng)做Store的操作時(shí)候,如果put 的key是 cacheable 也就對(duì)于調(diào)用Cacheable 的onStore方法,那么實(shí)現(xiàn)onStore 就能在store 觸發(fā)器事件。
5.CachePolicy
所謂CachePolicy 就是cache的策略,那么他與ManagerCache 有關(guān),需要為該Policy指定ManagerCache, 所以就有SetManagedCache(), 而某個(gè)Policy的屬性是在配置文件中指定的,所以就有了SetConfig(). 那么有混淆的就是Cache 與 ManagedCache, 其實(shí)他們的區(qū)別在于一個(gè)是行為聲明, 一個(gè)是具體的數(shù)據(jù)結(jié)構(gòu),后面會(huì)具體分析,而這里需要說明他們和Policy的關(guān)系不同的是,cache 中應(yīng)該是可以有多個(gè)policy,他是面向用戶的,用戶通常說的“我為某個(gè)Cache 指定了這么幾個(gè)策略組合” 那么這里的cache 就是指的Cache。而對(duì)于ManagedCache 他其實(shí)就是有個(gè)map實(shí)體,那么具體policy 的實(shí)現(xiàn)就是對(duì)該map的操作,比如FIFO 那么就要對(duì)這個(gè)map實(shí)行 FIFO的操作。
下面還有一個(gè)方法是Policy interface 必須聲明的,那就是 performMaintenance(), 他就是具體執(zhí)行該策略。Whirly 提供了下面幾種CachePolicy:
a. FIFO 先進(jìn)先出策略
b. LFU Least Frequently Used algorithm
c.LRU least recently used algorithm
Policy的機(jī)制:
首先需要一個(gè)Item對(duì)象, 他記錄被引用的object最近被使用,最近用的,以及被使用的記錄數(shù)等相關(guān)信息,在store的時(shí)候New 一個(gè)item 對(duì)象 一并put到managedCache,在執(zhí)行cache中remove store retrieve等操作的時(shí)候同時(shí)需要更新item中的信息。當(dāng)執(zhí)行到某個(gè)策略的時(shí)候,首先需要根據(jù)不同的policy 實(shí)現(xiàn)不同的Comparator( AddedComparator,CountComparator, UsedComparator) 而這些Comparator的Object比較原則就是將前面說的Item的記錄信息進(jìn)行比較,然后將Object排序。managedCache 根據(jù)相應(yīng)的Comparator進(jìn)行Sort。然后將managedCache中大于Cache設(shè)置大小的數(shù)據(jù)進(jìn)行remove,這樣整個(gè)過程就是performMaintenance
6. CacheDecorator
前面的cache只是接口,其實(shí)CacheDecrator才是cache的具體實(shí)現(xiàn),前面的cache只是一個(gè)interface,他定義了面向用戶接口的相關(guān)行為,具體他表示對(duì)于cache而言,提供給外部人員使用的行為接口。比如用戶只要關(guān)心從cache中remove,retrieve object的這樣的邏輯行為。而對(duì)于內(nèi)部數(shù)據(jù)結(jié)構(gòu)方面的具體操作,用戶并不關(guān)心。為了清晰我們需要另外獨(dú)立定義接口。這樣我們定義了ManagedCache接口,他繼承map interface。同時(shí)可以在該接口中定義其他數(shù)據(jù)操作的方法。
AbstractMapBackedCache是實(shí)現(xiàn)ManagedCache的抽象類,到這里就需要引入具體的數(shù)據(jù)結(jié)構(gòu),所以AbstractMapBackedCache中有個(gè) map的 field。而具體ManagedCache中的方法的實(shí)現(xiàn),也是對(duì)該map 變量的操作。
下面我們講講題外話:
對(duì)于map type 在java世界中有很多種,有jdk里面的HashMap TreeMap 這些我們都比較熟悉,我們可以認(rèn)為這些Map 是classic map而今天我們?cè)?/span>WhirlyCache中看見了其他幾個(gè)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項(xiàng)目中collections的一個(gè)Map
SynchronizedHashMapImpl:
Collections.synchronizedMap( new HashMap())
他表示該HashMap 是synchronized,該Map保證了該對(duì)象任何時(shí)候的一致性
通過繼承AbstractMapBackedCache,為他的map field設(shè)置不同的map,就實(shí)現(xiàn)不同的cache策略,這個(gè)策略有別與前面的policy,前面的是算法的策略,這里應(yīng)該是數(shù)據(jù)結(jié)構(gòu)的策略。
7.其他
a.實(shí)現(xiàn)對(duì)Hibernate Cache的控制 ,實(shí)現(xiàn)net.sf.hibernate.cache.Cache接口
b.添加關(guān)閉功能,當(dāng)ServletContext reload的時(shí)候具體實(shí)現(xiàn)ServletContextListener
posted on 2007-10-31 10:24 linugb118 閱讀(1402) 評(píng)論(1) 編輯 收藏