JCS(Java Caching System)簡(jiǎn)介以及相關(guān)文檔(cjsdn)
Posted on 2006-09-29 12:13 毛里求斯的化石 閱讀(234) 評(píng)論(0) 編輯 收藏 所屬分類: java&js相關(guān)JCS(Java Caching System)簡(jiǎn)介以及相關(guān)文檔(cjsdn)
概述
JCS是Jakarta的項(xiàng)目Turbine的子項(xiàng)目。它是一個(gè)復(fù)合式的緩沖工具。可以將對(duì)象緩沖到內(nèi)存、硬盤。具有緩沖對(duì)象時(shí)間過期設(shè)定。還可以通過JCS構(gòu)建具有緩沖的分布式構(gòu)架,以實(shí)現(xiàn)高性能的應(yīng)用。
對(duì)于一些需要頻繁訪問而每訪問一次都非常消耗資源的對(duì)象,可以臨時(shí)存放在緩沖區(qū)中,這樣可以提高服務(wù)的性能。而JCS正是一個(gè)很好的緩沖工具。緩沖工具對(duì)于讀操作遠(yuǎn)遠(yuǎn)多于寫操作的應(yīng)用性能提高非常顯著。
JCS的詳細(xì)說明在 http://jakarta.apache.org/turbine/jcs/
JCS的特性
JCS除了簡(jiǎn)單的將對(duì)象緩沖在內(nèi)存中以外,還具有幾個(gè)特性,以適應(yīng)企業(yè)級(jí)緩沖系統(tǒng)的需要。這些特性包括時(shí)間過期、索引式硬盤緩沖、并行式的分布緩沖等。
內(nèi)存緩沖
JCS現(xiàn)在支持兩種內(nèi)存緩沖算法LRU和MRU。通常都是使用LRU算法。
org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
使用內(nèi)存緩沖區(qū)需要定義緩沖區(qū)大小,當(dāng)超過緩沖區(qū)限制時(shí),會(huì)將緩沖內(nèi)容拋棄掉。如果有配硬盤緩沖,則將擠出來的緩沖內(nèi)容寫入硬盤緩沖區(qū)。
時(shí)間過期
JCS對(duì)于緩沖的對(duì)象,可以設(shè)定緩沖過期時(shí)間,一個(gè)對(duì)象在緩沖區(qū)中停留的時(shí)間超過這個(gè)時(shí)間,就會(huì)被認(rèn)為是“不新鮮”而被放棄。
索引式硬盤緩沖
一方面,為了避免緩沖區(qū)過大,撐爆虛擬機(jī)的內(nèi)存,另一方面又希望能夠緩沖更多的對(duì)象,JCS可以將超出緩沖區(qū)大小的對(duì)象緩存到硬盤上。配置上也比較方便,只需要指定緩沖臨時(shí)文件的存放目錄位置。硬盤緩沖將緩沖對(duì)象的內(nèi)容寫到文件上,但是將訪問索引保存在內(nèi)存中,因此也能夠達(dá)到盡可能高的訪問效率。
并行式的分布緩沖(Lateral)
通常,將對(duì)象緩沖在內(nèi)存中,一方面提高了應(yīng)用的性能,而另一方面卻使得應(yīng)用不可以分布式發(fā)布。因?yàn)榧僭O(shè)一個(gè)應(yīng)用配置在兩臺(tái)服務(wù)器上并行運(yùn)行,而兩臺(tái)服務(wù)器單獨(dú)緩沖,則很容易導(dǎo)致兩個(gè)緩沖區(qū)內(nèi)容出現(xiàn)版本上的不一致而出錯(cuò)。一個(gè)機(jī)器上修改了數(shù)據(jù),這個(gè)動(dòng)作會(huì)影響到本地內(nèi)存緩沖區(qū)和數(shù)據(jù)庫服務(wù)器,但是卻不會(huì)通知到另一臺(tái)服務(wù)器,導(dǎo)致另一臺(tái)上緩沖的數(shù)據(jù)實(shí)際上已經(jīng)無效了。
并行式的分布緩沖就是解決這個(gè)問題。可以通過配置,將幾臺(tái)服務(wù)器配成一個(gè)緩沖組,組內(nèi)每臺(tái)服務(wù)器上有數(shù)據(jù)更新,會(huì)橫向?qū)⒏碌膬?nèi)容通過TCP/IP協(xié)議傳輸?shù)狡渌?wù)器的緩沖層,這樣就可以保證不會(huì)出現(xiàn)上述情況。這個(gè)的缺點(diǎn)是如果組內(nèi)的并行的服務(wù)器數(shù)量增大后,組內(nèi)的數(shù)據(jù)傳輸量將會(huì)迅速上升。這種方案適合并行服務(wù)器的數(shù)量比較少的情況。
Client/Server式的緩沖(Remote)
客戶/服務(wù)端式的緩沖集群。這種方式支持一個(gè)主服務(wù)器和最高達(dá)到256個(gè)客戶端。客戶端的緩沖層會(huì)嘗試連接主服務(wù)器,如果連接成功,就會(huì)在主服務(wù)器上注冊(cè)。每個(gè)客戶端有數(shù)據(jù)更新,就會(huì)通知到主服務(wù)器,主服務(wù)器會(huì)將更新通知到除消息來源的客戶端以外的所有的客戶端。
每個(gè)客戶端可以配置超過一個(gè)服務(wù)器,第一個(gè)服務(wù)器是主服務(wù)器,如果與第一個(gè)服務(wù)器連接失敗,客戶端會(huì)嘗試與備用的服務(wù)器連接,如果連接成功,就會(huì)通過備用服務(wù)器與其他客戶端對(duì)話,同時(shí)會(huì)定期繼續(xù)嘗試與主服務(wù)器取得連接。如果備用服務(wù)器也連接失敗,就會(huì)按照配置順序嘗試與下一個(gè)備用服務(wù)器連接。
這種方式下,更新通知是一種輕量級(jí)的,一個(gè)機(jī)器上的數(shù)據(jù)更新,不會(huì)把整個(gè)數(shù)據(jù)傳輸出去,而只是通知一個(gè)ID,當(dāng)遠(yuǎn)程的其他機(jī)器收到更新通知后,就會(huì)把對(duì)應(yīng)ID的緩沖對(duì)象從本地的內(nèi)存緩沖區(qū)中移除,以保證不會(huì)在緩沖區(qū)內(nèi)出現(xiàn)錯(cuò)誤數(shù)據(jù)。
這種構(gòu)造需要分別配置客戶端和服務(wù)器,配置比較麻煩。
配置方法
JCS的好處之一,就是應(yīng)用在開發(fā)的時(shí)候,可以不用去構(gòu)思底層的緩沖配置構(gòu)架。同一個(gè)應(yīng)用,只需要修改配置,就可以改變緩沖構(gòu)架,不需要修改應(yīng)用的源代碼。配置方法也比較簡(jiǎn)單,就是修改配置文件cache.ccf。這個(gè)文件放置在WEB-INF/classes目錄下。配置格式類似log4j的配置文件格式。下面介紹一下使用各種緩沖結(jié)構(gòu)的配置方法。
內(nèi)存緩沖
#WEB-INF/classes/cache.ccf(以下內(nèi)容不要換行)
jcs.default=
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
上面配置了默認(rèn)緩沖屬性。一個(gè)應(yīng)用中,由于對(duì)象類型的不同,可能會(huì)使用多個(gè)緩沖區(qū),每個(gè)緩沖區(qū)都會(huì)有一個(gè)名字,如果在配置文件中沒有指明特定的緩沖區(qū)的屬性,所有的緩沖區(qū)都會(huì)根據(jù)默認(rèn)屬性來構(gòu)建。上面的內(nèi)容,指明緩沖區(qū)的大小為存放1000個(gè)對(duì)象,內(nèi)存緩沖器使用LRUMemoryCache對(duì)象。可選的還有MRUMemoryCache,應(yīng)該可以自定義新的內(nèi)存緩沖區(qū)。1000個(gè)緩沖對(duì)象這個(gè)容量,是指每個(gè)緩沖區(qū)都緩沖1000個(gè),而不是指所有緩沖區(qū)總?cè)萘俊R陨吓渲茫涂梢宰寫?yīng)用運(yùn)行起來。
時(shí)間過期
如果需要引入時(shí)間過期機(jī)制,則需要加上
jcs.default.cacheattributes.cacheattributes.UseMemoryShrinker=true
jcs.default.cacheattributes.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.default.cacheattributes.cacheattributes.ShrinkerIntervalSeconds=60
這里指明對(duì)象超過3600秒則過期,每隔60秒檢查一次。
索引式硬盤緩沖
索引式硬盤緩沖是輔助緩沖的一種,使用時(shí)需要做以下事情
#定義一個(gè)硬盤緩沖區(qū)產(chǎn)生器(Factory),取名為DC
jcs.auxiliary.DC=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheFactory
jcs.auxiliary.DC.attributes=org.apache.stratum.jcs.auxiliary.disk.indexed.IndexedDiskCacheAttributes
jcs.auxiliary.DC.attributes.DiskPath=g:/dev/jakarta-turbine-stratum/raf
#這里其實(shí)就是指明了緩沖文件存放到那里去。
然后,做以下修改
jcs.default=DC
這樣,所有未特別指定屬性的緩沖區(qū)都會(huì)自己使用一個(gè)硬盤緩沖區(qū),緩沖文件會(huì)以緩沖區(qū)的名字來命名。存放在指定的目錄下。
橫向式的并行緩沖
并行式的配置如下
jcs.auxiliary.LTCP=org.apache.jcs.auxiliary.lateral.LateralCacheFactory
jcs.auxiliary.LTCP.attributes=org.apache.jcs.auxiliary.lateral.LateralCacheAttributes
jcs.auxiliary.LTCP.attributes.TransmissionTypeName=TCP
jcs.auxiliary.LTCP.attributes.TcpServers=192.168.10.129:1121,192.168.10.222:1121
jcs.auxiliary.LTCP.attributes.TcpListenerPort=1121
jcs.auxiliary.LTCP.attributes.PutOnlyMode=false
這里的配置是在41,129,221三臺(tái)機(jī)器上實(shí)現(xiàn)并行緩沖的。
大家都在1121端口上監(jiān)聽,同時(shí)與另外兩臺(tái)機(jī)器連接。如果連接失敗,就會(huì)等待一個(gè)時(shí)間后再連接一次,直到連接成功為止。三臺(tái)機(jī)器中任意一臺(tái)的緩沖區(qū)發(fā)生更新,比如put和remove動(dòng)作,就會(huì)把更新傳遞給另外兩臺(tái)。
單獨(dú)指明某個(gè)緩沖區(qū)的屬性
如果,針對(duì)某個(gè)緩沖區(qū),比如叫做TestCache1,需要單獨(dú)配置屬性,可以如下配置。
jcs.region.testCache1=DC,LTCP
jcs.region.testCache1.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes
jcs.region.testCache1.cacheattributes.MaxObjects=1000
jcs.region.testCache1.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
jcs.region.testCache1.cacheattributes.UseMemoryShrinker=true
jcs.region.testCache1.cacheattributes.MaxMemoryIdleTimeSeconds=3600
jcs.region.testCache1.cacheattributes.ShrinkerIntervalSeconds=60
system.GroupIdCache
這個(gè)概念我也不是很清楚。不過JCS文檔中指出配置以下內(nèi)容會(huì)比較好。
jcs.system.groupIdCache=DC
jcs.system.groupIdCache.cacheattributes=org.apache.stratum.jcs.engine.CompositeCacheAttributes
jcs.system.groupIdCache.cacheattributes.MaxObjects=10000
jcs.system.groupIdCache.cacheattributes.MemoryCacheName=org.apache.stratum.jcs.engine.memory.lru.LRUMemoryCache
這可能是JCS自己的組管理體系上的緩沖區(qū)。
Client/Server式的緩沖(Remote)
這種構(gòu)架需要單獨(dú)配置客戶端和服務(wù)端,如果要研究,可以查看 http://jakarta.apache.org/turbine/jcs/RemoteAuxCache.html