七段

无论怎样,请让我先感谢一下国家。

BlogJava 首页 新随笔 联系 聚合 管理
  35 Posts :: 2 Stories :: 7 Comments :: 0 Trackbacks
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行为。也就是开闭原则。下次再从中总结一下几种设计模式的经典应用。



posted on 2010-03-28 23:10 sevenduan 阅读(2494) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问