Ref: http://community.jboss.org/wiki/JBossCacheOfficialDocumentation
Cache的目的是為了以空間換時間,一次計算結果為多次重用。
空間可以是實時內存空間、持久化的硬盤空間。時間可以是運算時間、連接時間、傳輸時間等。
Cache可以分為LocalCache和DistributedCache。
最簡單的LocalCache可以通過維護一個ConcurrentHashMap實現。
缺點是:
1,內存有限,容易out of memory (定期清除?持久化?)
2, 需要對全map做concurrency維護,粗粒度的鎖定爭用會影響性能(樹結構維護?)
在一個專業的企業級應用中,cache除了高性能和線程安全的要求,還要支持事務、高可用性、持久化、容錯、集群同步等。
JBossCache是一個典型的企業級cache實現,他采用樹結構且支持集群和事務特性。
雖然JBossCache這把牛刀也可以在standalone的JS2E應用中用來殺雞,但我們應該更關心用他在集群環境中怎么殺牛。
JBossCache分為非集群模式(Local)和集群模式。
集群模式根據實現策略又分為replication和invalidation。
1 replication:通過拷貝改變的cache對象來保證與集群中其他cache同步。replication又可細分為同步replication和異步repliation兩種,異步replication較快,put以后馬上返回,但是replication出錯了,事務還是算完成了不回回滾。同步replication要花時間等待其他的cache完成replication的通知才能結束。
2 invalidation: 如果cache狀態改變,僅僅是給其他cache發個通知,收到通知的cache把臟數據清除掉。invalidation也可分為同步和異步兩種,區別是發送通知的廣播方式一個是同步一個是異步。
在jboss cluster中,我們最好通過MBean來部署jboss cache。這樣又幾個好處:
1,JBoss NS支持Cluster
我們就可以通過JBoss NamingService來訪問cache。如果在local NS中查不到cache,jbss NS還會去查cluster中其他的cache。
2,利用MBean的特性
通過CacheMBean, 我們可以方便的管理Cache Service,實時的啟動、停止或者改變一些配置,還可以監控到一些cache統計數據。
3,利用
microcontainer的特性
我們可以通過配置XML文件來完成cache相關的所有對象聲明。
簡而言之,就是利用java reflection和AOP的技術就不用寫聲明cache的代碼了。
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="urn:jboss:bean-deployer:2.0">
<!-- First we create a Configuration object for the cache -->
<bean name="ExampleCacheConfig"
class="org.jboss.cache.config.Configuration">
build up the Configuration
</bean>
<!-- Factory to build the Cache. -->
<bean name="DefaultCacheFactory" class="org.jboss.cache.DefaultCacheFactory">
<constructor factoryClass="org.jboss.cache.DefaultCacheFactory"
factoryMethod="getInstance" />
</bean>
<!-- The cache itself -->
<bean name="ExampleCache" class="org.jboss.cache.CacheImpl">
<constructor factoryMethod="createnewInstance">
<factory bean="DefaultCacheFactory"/>
<parameter><inject bean="ExampleCacheConfig"/></parameter>
<parameter>false</parameter>
</constructor>
</bean>
<!-- JMX Management -->
<bean name="ExampleCacheJmxWrapper" class="org.jboss.cache.jmx.CacheJmxWrapper">
<annotation>@org.jboss.aop.microcontainer.aspects.jmx.JMX(name="jboss.cache:service=ExampleTreeCache",
exposedInterface=org.jboss.cache.jmx.CacheJmxWrapperMBean.class,
registerDirectly=true)</annotation>
<constructor>
<parameter><inject bean="ExampleCache"/></parameter>
</constructor>
</bean>
</deployment>
后記:
1,jboss cache的naga版中,采用
Multi-versioned
concurrency control來實現并發。下次再從中總結一下多線程的學習。
2,jboss cache通過結合visitor pattern和command pattern,把對cache node的操作與訪問從中隔離出來,不用改變或者擴展node對象就可以添加新的node行為。也就是開閉原則。下次再從中總結一下幾種設計模式的經典應用。