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