自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

寫自己的緩存框架,JAD-CACHE架構(gòu)設(shè)計篇

開發(fā) 架構(gòu)
在之前一篇《寫一個自己的通用緩存框架,以同時支持ehcache、mecache以及springcache注解等等》博文中,列出了自己的通用緩存框架需要實(shí)現(xiàn)在的大致功能總結(jié)如下:

在之前一篇《寫一個自己的通用緩存框架,以同時支持ehcache、mecache以及springcache注解等等》博文中,列出了自己的通用緩存框架需要實(shí)現(xiàn)在的大致功能總結(jié)如下:

    1、提供統(tǒng)一的緩存操作api;

    2、支持同時使用多種緩存實(shí)現(xiàn);

    3、提供靈活的配置;

    4、需要防止緩存穿透;

    5、需要可以靈活指定緩存存活時間;

    6、需要任意控制緩存的停用或啟用。

    目前這個框架的編碼部分已完成,并取名為JAD-CACHE,取這個名字的原因是因?yàn)樗俏业膫€人的JAD項(xiàng)目的一部分,JAD項(xiàng)目是本人用業(yè)余時間開發(fā)一個企業(yè)基礎(chǔ)架構(gòu)平臺,因涉及的東西比較多,而且很多模塊還沒有完全完成。目前準(zhǔn)備把其中做的比較完善的緩存模塊單獨(dú)從原項(xiàng)目中剝離出來作為一個獨(dú)立的項(xiàng)目并準(zhǔn)備開源給大家測試和使用,于是也就有了JAD-CACHE。

     本文先展示這個框架的原理及架構(gòu)設(shè)計,后續(xù)開放源代碼后再發(fā)布一些使用手冊方面的文章。

     JAD-CACHE緩存框架是在spring cache模塊的基礎(chǔ)上擴(kuò)展而來,在上一篇博文《通用緩存框架,spring緩存模塊原理分析篇》已經(jīng)系統(tǒng)分析過srping cache的原理,這里不再重復(fù)。spring cache模塊重要的兩個類就是org.springframework.cache.Cache和 org.springframework.cache.CacheManager?,F(xiàn)在我跟據(jù)自己的需要對它們進(jìn)行擴(kuò)展。

    我設(shè)計的Cahce相關(guān)的擴(kuò)展類圖如下:

圖:Cahce擴(kuò)展類類圖1

       上圖中灰色部分是spring自已的類,其它的是擴(kuò)展出來的。上圖ManageredCache是一個接口,表示這個Cache可由本框架的CacheClient實(shí)例管理起來(關(guān)于CacheClient的概念稍后介紹)。ManageredCache接口在父接口Cache的基礎(chǔ)上,增加了isAllowNullValues()等等方法,作用分別如下:

getCacheClient()

獲得管理它的CacheClient實(shí)例

isAllowNullValues()

能否在此緩存中保存null值,防止緩存穿透

getActivityTime()

獲得此緩存中對像存活時間,注意這個存活時間是一個業(yè)務(wù)存活時間,開發(fā)人員可通過配置指定一個默認(rèn)的時間,也可以在調(diào)用put()方法緩存對像時通過參數(shù)另外指定一個存活時間。這樣,在調(diào)用get()方法從緩存中取出對像后,會先通過個這個方法判斷對像是否失效(即使它依舊存在于緩存中,但我們可以在業(yè)務(wù)的角度上以為它失效了),這個存活時間應(yīng)該短于用戶在ehcache.xml等配置文件配置的存活時間,這樣就實(shí)現(xiàn)了個性化指定同一類型不同對像的存活時間。

put(Object, Object,int)

這個方法跟父類Cache接口的put(Object,Object)功能相同,就是把對像緩存起來,但它支持一個int類型的參數(shù),用于指定對像存活時間的秒數(shù)。

size()

統(tǒng)計對像總數(shù)

keySet()

獲得所有key

    所有要緩存的數(shù)據(jù)都不是直接持久化到緩存容器中的,而是被裝包成了一個個CacheValue類型的實(shí)例,在上圖的類圖中,可以看到,CacheValue類包含兩個屬性expiryTime和value,其中expiryTime是超時時間,value就是據(jù)體的數(shù)據(jù)對像。如果數(shù)據(jù)對像為null值,就轉(zhuǎn)換成NullCacheData實(shí)例。在AbstractManageredCache這個抽象類的相關(guān)方法中,就實(shí)現(xiàn)了這些邏輯。

     AbstractManageredCache是對ManageredCache接口的抽象實(shí)現(xiàn),實(shí)現(xiàn)了在操作緩存之前,先通過管理它的CacheClient實(shí)例判斷當(dāng)前緩存客戶端的狀態(tài)是否已開啟 (調(diào)用cacheClient的isStarted()方法),如果啟用,就調(diào)用父接口Cache中聲明的getNativeCache()獲得具體的緩存實(shí)例操作緩存,如果沒有啟用,就什么也不做。同時,在它的put()方法實(shí)現(xiàn)過程中,會跟據(jù)它的activityTime屬性指定存活時間,或跟據(jù)allowNullValues屬性決定是否緩存null值,并將所有要緩存的數(shù)據(jù)包裝成CacheValue實(shí)例持久化到緩存容器中。而在get()方法實(shí)現(xiàn)的羅輯,也會做相應(yīng)的操作,跟據(jù)activityTime屬性踢出超時的對像,并將緩存容器中的CacheValue實(shí)例轉(zhuǎn)換成原始的數(shù)據(jù)類型。

    在spring原來的緩存模型中,所有的Cache實(shí)例都被ManagerCache所管理。但本框架抽像出了一個叫CacheClient的概念,所有的緩存實(shí)例都被擴(kuò)展成了ManageredCache對像,并被一個CacheClient實(shí)例管理起來(而此CacheClient實(shí)例又持有一個CacheManager的引用,這樣一來Cache也就可以通過CacheClient間接的被ManagerCache管理)。這樣做有一個好處就是:在Cache操作緩存之前,先通過它的CacheClient判斷當(dāng)前的緩存狀態(tài),跟據(jù)這個裝態(tài)決定是否要進(jìn)行操作。設(shè)計CacheClinet還有一個目地,就是讓多個緩存實(shí)現(xiàn)能更好的共存于同一個應(yīng)用之中,比如讓EhCache實(shí)現(xiàn)的緩存交給一個CacheClinet管理,讓MemCache實(shí)現(xiàn)的緩存交給另一個CacheClinet管理。在spring原來的緩存模塊中,設(shè)計了一個叫CompositeCacheManager的類,可以同時配置多個CacheManager實(shí)例以達(dá)到這個目地。但我棄用它,改用CacheClinet的目地,就是想增加可以任意停用或啟用某些Cache的功能。比如,當(dāng)memcache服務(wù)器掛掉時,我們通過它對應(yīng)的CacheClinet實(shí)例改變這個實(shí)例管理的所有Cache的狀態(tài),停用它,從而達(dá)到從應(yīng)用層上禁用或啟用緩存的目地。CacheClient相關(guān)的類圖如下:

圖:CacheClient相關(guān)類圖

    上圖中的CacheClient類是一個接口,它聲明的一些諸如start(),stop()等方法,用于修改本實(shí)例的狀態(tài),啟用或停用,而isStarted()就是用來檢查狀態(tài)的,返回當(dāng)前Client是否啟用。每一個CacheClient實(shí)例管理一個CacheManager,通過該接口中的getCacheManager()可以獲得它所控制的CacheManager實(shí)例引用,每個一個實(shí)例有一個***的名字,通過getClientName()可以獲取它的名字。除此外,此接口還有一些諸如getAllowNullValues(),setDefActivityTime()之類的方法。這是為了方便開發(fā)人員對緩存的配置,開發(fā)人員在配置CacheClient實(shí)例時,可以在這里配置allowNullValues, defActivityTime等屬性,這樣再在配置CacheManager或者Cache實(shí)例時就可以不指定了這些屬性了,Cache會自動繼承它的Client的屬性值。這些配置在CacheClient接口的抽像實(shí)現(xiàn)類AbstractCacheClient中都有相應(yīng)的實(shí)現(xiàn)。

     在AbstractCacheClient中還有一個重要的屬性,就是autoStart屬性。這個屬性如果配置為true,那在spring容器初始化的時候,這個Client實(shí)例一但生成,就會自動調(diào)用它的start()啟動它,以使得它所控制的CacheManager可以正常操作緩存。否則,它不會自動啟動,它所控制的所有Cache都處于禁用狀態(tài)。

    另外,為了方便配置,在AbstractCacheClient還提供了autoCreateCache屬性,用于指定此客戶端能否自動創(chuàng)建緩存實(shí)例。在Spring原來的緩存配置中,需要把用到的每個Cache都寫到配置文件中,要么配到ehcache.xml中,要么在配置CacheManager時附加Cache實(shí)列相關(guān)的配置。否則,在操作沒有配置的緩存時,會提示找不到某某名稱的cache。在本框架中,如果指定了autoCreateCache屬性為true,在調(diào)用CacheManager.getCache(String name)獲取不到Cache時,會自動創(chuàng)建一個默認(rèn)的(通過覆蓋CacheManager.getMissgeCache()實(shí)現(xiàn))。當(dāng)然,如果指定autoCreateCache為false時,就不會自動創(chuàng)建,這要求用戶在ehcache.xml中自己配置。當(dāng)然,為了方便,本框架,還可以直接在CacheClient中配置,上面的類圖AbstractCacheClient中兩個屬性cacheNames和cacheBeans就是用于這個配置的。用戶可通過cacheNames只配置名稱,或者通過cacheBeans屬性配置一個類型為的JadCache實(shí)例bean。這個JadCache類似于spring 在實(shí)現(xiàn)ehcache時提供的EhCacheFactoryBean。只不過這個更加簡潔通用。如果只通過cacheNames配置一個Cache的名稱,那么此Cache實(shí)例的相關(guān)屬性都采用默認(rèn)值這要求用戶在ehcache.xml配置文件中配置一個defaultCache,或需要在memcache.xml中配置一個默認(rèn)的cacheclient。

    每一個CacheClient***管理一個CacheManager實(shí)例(在上面類圖中可以看到,AbstractCacheClient類中有一個JadCacheManager類型的屬性:cacheManager。關(guān)于本框架的CacheManager擴(kuò)展稍后介紹)。CacheClient在被spring初始化時,會自動調(diào)用registryCacheManager()方法,跟據(jù)不同的緩存實(shí)現(xiàn)廠商生成一個對應(yīng)的CacheManager實(shí)例,并注冊到spring context中,同時調(diào)用initCache()方法通過配置中的cacheNames或cacheBeans自動初始化所有的Cache實(shí)例。初始化完成后,再調(diào)用registryToMasterCacheManager()方法,這個方法稍后介紹。

    一個應(yīng)用系統(tǒng)中,可以有一個或多個CacheClient實(shí)例,每個CacheClient實(shí)例控制一個CacheManger。開發(fā)人員通過配置不同的CacheClient實(shí)例可以實(shí)現(xiàn)同時支持多個不同的緩存實(shí)現(xiàn),比如,把EhCache相關(guān)的緩存配置到一個CacheClient中而把MemCache配置到另一個CacheClient中。

    為了統(tǒng)一管理所有CacheClient實(shí)例,本框架設(shè)計了一個叫CacheClientManager來管理所CacheClient實(shí)例,它有一個抽像實(shí)現(xiàn)AbstractCacheClientManager,這個抽像類中,也有allowNullValues, defActivityTime等CacheClient中具的相同的屬性,只不過這里的屬性作為一個全局的配置,使得CacheClient可以省去這些配置而直接使用CacheClientManager中的配置。整個應(yīng)用中,只能有CacheClientManager實(shí)例,但這個實(shí)例可以管理一個或多個CacheClient。而通常況下,一些簡單的應(yīng)用系統(tǒng)中,往往只有一種緩存實(shí)現(xiàn),也就是只需要配置一個CacheClient,因此AbstractCacheClientManager給出了兩個不同的實(shí)現(xiàn)類,分別是上圖中紅顏色的SingleClientManager和MultiClientManager,分別表示單CacheClient管理或多CacheClient管理器。開發(fā)人員可跟據(jù)業(yè)務(wù)情況選擇性使用其中一個進(jìn)行配置。

    前文提到,每個CacheClient在初始化時,會自動生成一個對應(yīng)的CacheManager實(shí)例并注冊到Spring上下文中,但Spring在操作緩存時,為了能準(zhǔn)確的通過CacheManager找到相應(yīng)名稱的Cache實(shí)例,這就要求還需要對這些CacheManager實(shí)例進(jìn)行統(tǒng)一管理。在spring原來的緩存模塊中,提供了一個叫CompositeCacheManager的實(shí)現(xiàn)類,以組合設(shè)計模式的方式來管理這些CacheManager實(shí)例,這個CompositeCacheManager實(shí)現(xiàn)類有一個列表指向所有CacheManager實(shí)例的引用。在執(zhí)行g(shù)etCache(String)時會遍歷這個列表,循環(huán)調(diào)用每個實(shí)例的getCache(String)方法,然后返回一個不為null的Cache,但是如果所有的CacheManager都獲取不到Cache時,這個方法最終是會返回null的。然而,在本框架中,是支持找不到Cache時自動創(chuàng)建的,所以在本框架中,我設(shè)計了一個叫MasterCacheManager的類來管理這些CacheManager,同時,這個類有一個叫defCacheManager的CacheManager屬性來指定一個默認(rèn)的CacheManager。在跟據(jù)名稱找不到任何Cache時,就自動調(diào)用這個默認(rèn)CacheManager的addCache()方法來自動創(chuàng)建一個。本框架CacheManager相關(guān)的類圖如下所示:

圖:CacheManager類圖

    上圖灰色總分是spring緩存模塊自帶的類,其它顏色是擴(kuò)展類。其中最右邊的MasterCacheManager類就是上文提到管理所有CacheManager的實(shí)現(xiàn)類。上圖左邊的JadCacheManager是一個接口,提供initCache(JadCache)和newCache(JadCache)兩個方法,這兩個方法,主要是用于在CacheClient初始化過程自動生成CacheManager實(shí)現(xiàn)類后,準(zhǔn)備通過initCache()方法來初始化配置中的Cache來調(diào)用的。對于MasterCacheManager類的實(shí)例化,開發(fā)人員無需額外在spring context中配置,因?yàn)樵贑acheClientManager的初始化過程中,會自動注冊一個MasterCacheManager類型的實(shí)例到spring context中(上面類圖AbstractCacheClientManager這個類中的registerMasterManager()方法就是用來做這個事的)。而這個類中cacheManagerMap的屬性就是按名稱組織起來的CacheManager類型的集合。在每個CacheClient初始化時自動生成CacheManager實(shí)例后,會調(diào)用CacheClient類的registryToMasterCacheManager()方法,這個方法會從當(dāng)前Spring conetxt中獲取到MasterCacheManager實(shí)例,然后調(diào)用它的register()方法,把它注冊到MasterCacheManager實(shí)例中(添加到cacheManagerMap集合)。

上面類圖中的JadAbstractCacheManger是借用了Srping的AbstractCacheManger對JadCacheManager的一個抽象實(shí)現(xiàn),后面在集成EhCache或MemCache等所有緩存時就從這個類往下擴(kuò)展。

以上就是本框架的一個總體設(shè)計,因?yàn)槠竭^長。后面再在其它的文章中給出在這個基礎(chǔ)上擴(kuò)展EhCache和MemCache的方案,并實(shí)現(xiàn)一個基于Map的內(nèi)存緩存實(shí)現(xiàn)。想關(guān)注更多信息或者想及時了解動態(tài)的同學(xué)們可以掃以下二維碼關(guān)注我的微信公眾號,多謝

責(zé)任編輯:張燕妮 來源: 開源中國社區(qū)
相關(guān)推薦

2016-12-05 08:46:07

緩存架構(gòu)設(shè)計

2015-06-02 04:34:05

架構(gòu)設(shè)計

2017-11-06 08:28:44

DDD架構(gòu)設(shè)計IT

2023-07-09 15:20:00

緩存平衡性能

2025-04-15 04:00:00

2013-05-27 10:58:28

Tumblr架構(gòu)設(shè)計雅虎收購

2023-10-30 07:56:46

Spring緩存

2023-05-12 08:06:46

Kubernetes多云架構(gòu)

2009-09-22 10:50:04

Hibernate c

2023-07-05 08:00:52

MetrAuto系統(tǒng)架構(gòu)

2009-01-15 09:43:51

Web架構(gòu)設(shè)計緩存

2012-05-11 10:38:15

Cloud Found

2011-09-07 09:43:04

ASP.NET服務(wù)框架

2009-06-15 16:05:30

設(shè)計AnnotatioJava

2021-12-26 08:08:00

緩存Cache開發(fā)

2015-06-02 04:17:44

架構(gòu)設(shè)計審架構(gòu)設(shè)計說明書

2018-06-08 09:48:52

緩存架構(gòu)設(shè)計

2009-07-06 10:36:41

敏捷開發(fā)

2021-11-08 06:57:35

Redis架構(gòu)設(shè)計

2019-12-11 10:07:02

緩存架構(gòu)數(shù)據(jù)庫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號