偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

    3、提供靈活的配置;

    4、需要防止緩存穿透;

    5、需要可以靈活指定緩存存活時(shí)間;

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

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

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

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

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

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

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

getCacheClient()

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

isAllowNullValues()

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

getActivityTime()

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

put(Object, Object,int)

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

size()

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

keySet()

獲得所有key

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

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

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

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

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

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

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

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

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

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

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

圖:CacheManager類圖

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

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

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

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

2016-12-05 08:46:07

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

2017-11-06 08:28:44

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

2015-06-02 04:34:05

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

2023-07-09 15:20:00

緩存平衡性能

2025-04-15 04:00:00

2023-10-30 07:56:46

Spring緩存

2009-09-22 10:50:04

Hibernate c

2013-05-27 10:58:28

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

2023-05-12 08:06:46

Kubernetes多云架構(gòu)

2009-06-15 16:05:30

設(shè)計(jì)AnnotatioJava

2011-09-07 09:43:04

ASP.NET服務(wù)框架

2021-12-26 08:08:00

緩存Cache開發(fā)

2025-05-09 08:45:13

2023-07-05 08:00:52

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

2015-06-02 04:17:44

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

2009-07-06 10:36:41

敏捷開發(fā)

2021-11-08 06:57:35

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

2009-01-15 09:43:51

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

2012-05-11 10:38:15

Cloud Found

2019-12-11 10:07:02

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

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