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行为。也就是开闭原则。下次再从中总结一下几种设计模式的经典应用。