<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1400) 評論(1)  編輯  收藏

    Feedback

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

    他的缺陷是 他設置的緩存大小其實是存儲object的多少 而不是實際的內存大小 因此如果object 很大并且設置的緩存大小也很大 會出現內存溢出的問題   回復  更多評論   



    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    My Links

    Blog Stats

    常用鏈接

    留言簿(1)

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲AV成人影视在线观看| 亚洲av无码成人影院一区| 国产亚洲一区二区手机在线观看| 亚洲视频在线视频| 亚洲久热无码av中文字幕| 一级人做人a爰免费视频| av无码久久久久不卡免费网站| 免费成人午夜视频| 亚洲免费黄色网址| 色爽黄1000部免费软件下载| 国产乱码免费卡1卡二卡3卡| 久久亚洲国产精品123区| 亚洲国产成人精品激情| a毛片免费全部在线播放**| 最近的免费中文字幕视频| 亚洲精品二区国产综合野狼 | 亚洲精品国产成人片| 午夜免费啪视频在线观看| 亚洲国产精品成人网址天堂| 亚洲日本在线电影| 日本免费v片一二三区| 亚洲国产精品日韩在线| 亚洲免费观看视频| 在线亚洲午夜理论AV大片| 亚洲欧美熟妇综合久久久久| 免费一看一级毛片| 国产午夜无码片免费| 精品亚洲一区二区三区在线观看 | 国产视频精品免费视频| 日本媚薬痉挛在线观看免费| 一级毛片成人免费看a| 亚洲va无码专区国产乱码| 成年女人A毛片免费视频| 亚洲麻豆精品果冻传媒| 四虎影视在线影院在线观看免费视频 | 在线不卡免费视频| 亚洲一区中文字幕在线电影网| 免费精品无码AV片在线观看| 亚洲国产AV无码专区亚洲AV| 青青操视频在线免费观看| 亚洲乱码一二三四区麻豆|