linugb118--java space

          Java

          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è)policycache策略)的定義,這些policy現(xiàn)在主要有FIFO,LRU等等,這些多個(gè)policys組合成當(dāng)前該cachecache策略。除了主要策略 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 獲取cachesize

          對(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

          作為cachekey的話,那么在執(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ì)象 一并putmanagedCache,在執(zhí)行cacheremove store retrieve等操作的時(shí)候同時(shí)需要更新item中的信息。當(dāng)執(zhí)行到某個(gè)策略的時(shí)候,首先需要根據(jù)不同的policy 實(shí)現(xiàn)不同的Comparator( AddedComparatorCountComparator, UsedComparator) 而這些ComparatorObject比較原則就是將前面說的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)心從cacheremove,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)  編輯  收藏

          Feedback

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

          他的缺陷是 他設(shè)置的緩存大小其實(shí)是存儲(chǔ)object的多少 而不是實(shí)際的內(nèi)存大小 因此如果object 很大并且設(shè)置的緩存大小也很大 會(huì)出現(xiàn)內(nèi)存溢出的問題   回復(fù)  更多評(píng)論   



          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 高平市| 怀来县| 越西县| 麟游县| 五大连池市| 集安市| 赞皇县| 天台县| 延边| 临高县| 南阳市| 福安市| 太原市| 武山县| 海南省| 嘉定区| 绵阳市| 紫云| 县级市| 大洼县| 津市市| 独山县| 武邑县| 阿巴嘎旗| 江安县| 巴南区| 柞水县| 中超| 穆棱市| 乐业县| 青川县| 道孚县| 乌苏市| 旬阳县| 水城县| 潜山县| 黎城县| 弥勒县| 民县| 静乐县| 乃东县|