从liferay看分布式cache的实现

板桥里人 https://www.jdon.com 2003/04/18

cache是优化性能的必须选择,cache也是一个中大型系统必须选择的技术。Cache是专门针对有状态数据的系统做的一种优化措施。在J2EE中,通常我们有很多功能会在WEB层实现,比如Web Service,但是这些网络功能是非常耗时的,如果每个request都进行网络通讯,无疑性能是很低的。

因此, 我们需要将一些经常反复使用的状态数据一直保存在内存中,在有效期内供客户端不断反复访问。

使用HashMap保存对象是实现的最基本思路,很多开源软件都有自己的cache机制,如Jive的cache机制主要实现了单机系统的缓冲机制,如果多台服务器运行,jive 2.1以前的cache机制是无法 实现的,这迫使它在jive 2.5以后采取第三方非开源的分布式Cache系统。

那么有没有一种简单的分布式cache实现机制呢?

最新门户portal开源软件Liferay向我们展现了利用EJB实现分布式cache简单实用的实现。

Cache机制是利用内存中的对象来代替远程对象,因此它是一种Proxy模式,我们来看看几个关键的类:

1.Cache类

核心类是com.liferay.cache.model.cache,通过构造一个new cache(Object obj),将需要cache的对象
赋值进去,就能达到cache的目的,以后通过cache.getObject()可以得到这个对象。

为了达到分布式cache目的,多态Server能共享同样的Cache,liferay使用了数据库来持久化这些cache:

Cache
CacheEJB
CacheHome

这三个类是一个实体bean, 对应一个叫cache的数据库,使用集中式的数据库可以让多态服务器来共享这些被cache的 对象。Cache中有两个字段:ID和String型的text, 后者是将对象序列化以String方式保存在数据库中。

Modeler 是将实体Bean的Cache 逆向序列化成Cache。CachePool是实体Bean Cache的缓冲池。

通过CacheManager操作上述的CachePool Modeler和Cache,可以实现所有的有关Cache的生成 管理操作。

实际上,这个Cache是供WEB层使用的,因此,通过CacheManagerUtil这个总的接口向WEB层提供Cache功能,在WEB层,WebCachePool以单态的形式为所有WebCachable的对象提供cache。

可见,整个Cache机制有三层,第一层WebCachePool是离应用请求最近的;当超过更新期间后,第一层将从第二层CachePool获取,如果第二层没有,将从数据库中获取,如果数据库没有或过期,则启动这个被Cache的对象的某个方法,让其从远程通过网络获取新值。。

2.Cachable对象

上面我们已经提到被Cache的对象,这个对象能够被Cache,需要具备一定的条件,它要实现WebCacheable,而WebCacheable是个综合接口,它必须具备两个属性Cacheable, Converter。

Cachable的接口只有getRefreshTime()方法,意味着只要指定了自己的更新时间就能Cacheable,同时还要再具备Converter,Converter代表的意思是,如果Cacheable规定的更新时间失效后应该做的事情:到真正数据源再获取一次数据,由此可见,Cache的好处就是,不必每次需要这个数据时,都要执行一次Converter。

举例:

天气预报,我们可能会在我们首页上放置天气预报,这个天气预报的信息我们是通过Web Service到某个专业站点获取的,那很显然,不可能我们的首页在每次被访问时,都要通过Web Service这样的网络连接去获取天气数据,这时,我们就需要对天气数据Weather进行Cache。

//根据邮编构成一个WeatherConverter对象
WebCacheable wc = new WeatherConverter(zip);

//通过缓冲池再获得这个对象,Cache实际是一种Proxy模式
Cache cache = WebCachePool.get("weather." + zip, wc);

//从cache中再返回该对象。
return (Weather)cache.getObject();

从上可见,当客户端我们的首页后,我们不是直接返回wc.convert(zip),这个方法就是通过Web service到远程获取天气数据,而是中间强行插入一个proxy"网关",使用cache.getObject()来返回天气数据,这样,就起到Cache缓冲的效果。

liferay是个非常不错的门户软件,尤其是它的portlet概念,整合了普通门户网站的所有功能,非常类似IBM的Portal软件,但它是开源免费的。而且它的很多设计思想可以借鉴实现在我们自己的应用中。

更多Cache缓存专题