jive的cache机制






jive的cache机制

jive的cache机制

by zhaochaohua@sina.com


1.jive Cache基础类


  • Cacheable接口:

      所有可能需要cache的对象均实现此接口。在jive中,需要缓存的对象包括:User,Group,UserPerm等用户相关及权限相关数据;Forum(论坛)对象;Thread(话题)对象;Message(消息)对象。


   所有这些类都实现了Cacheable接口。例如:


        public class DbForum implements Forum, Cacheable {......}


        public final class DbForumMessage implements ForumMessage, Cacheable {......}


  • Cache类:

    Cache类维护一类的缓存对象的队列。例如:所有缓存的Message(消息)对象将存放在一个Cache实例中。


    Cache类使用属性cachedObjectsHash(类型:HashMap)
来保存本类缓存对象的列表;使用lastAccessedList(类型:LinkedList)来维护本类缓存对象的访问顺序。同时,Cache类还启动了CacheTimer线程。该线程的工作是:周期性地扫描本Cache队列,进行队列维护工作。(注1


  至于系统怎么区分一个Cache类实例的类型,即:这个Cache类实例保存的对象是Message对象,还是Forum对象,还是User对象,这个工作交给DbCacheManager类来做,如下。


  • DbCacheManager 类:

    Cache总管理器。维护着9个的Cache队列,每个Cache队列都是如上所述的一个Cache
Class。


  DbCacheManager使用一个数组属性caches来保存9个类型的Cache队列,每个队列的类型就是该队列在caches数组中的下标。


  caches = new Cache[9];


    DbCacheManager提供add,remove和get的方法,分别用于增加一个被缓存的对象,删除一个被缓存的对象和获取一个被缓存对象;而真正add时的复杂算法则交给Cache
类的add方法去执行。


   public void add(int cacheType, Object key, Cacheable object) {

     caches[cacheType].add(key, object);

   }


以上是jive Cache机制的基础。现在来看jive中怎么去使用Cache机制的。


2.在Factory中使用Cache。


  以message的缓存为例,jive中,读取一条message的唯一入口是DBForumFactory的getMessage(int
msgID)方法。


  例如,在viewThread.jsp界面上获取message对象的过程:最终都要调用到Factory的getMessage(int
msgID)方法。


  因此,只要在Factory的getMessage(int msgID)方法中实现了Cache机制,就在整个系统内实现了Message对象的缓存。


   DbForumMessage的getMessage(String msgID)的逻辑是这样的:



message = cacheManager.get(CACHE_TYPE,msgID);//从cache中获取


if(message == null) {//不在cache中

//Load the message

message = new DbForumMessage(msgID, this);

//Add it to cache.

cacheManager.add(CACHE_TYPE, msgID, message);

}

return message;



   在这里,cacheManager就是一个DbCacheManager实例。在DbForumFactory的构造函数中初始化好:


   //DbForumFactory.java



public DbForumFactory() {

cacheManager = new DbCacheManager();

......

}



3.注释

注1:在jive1.2.1中,CacheTimer实际上没有做任何事情。

注2:从实现的角度讲,被缓存的对象应该在内存中只保存一个实例。也就是说,一种类型的Cache类,例如:类型为Message的Cache队列,在内存中只能保存一个实例。为达到这个目的,一般情况下都会使用singleton机制。在jive中也是采用singleton机制的。

  DbCacheManager并没有提供这样的singleton机制。ForumFactory应用了Singleton模式(参看ForumFactory.java)。而在ForumFactory的具体实现类DbForumFactory的构造函数中,创建了一个DbCacheManager对象,从而保证了Cache队列的"单子"属性。

Jive的cache好像复杂了点,ofbiz的UtilCache我觉得不错,主要是好用,好理解。