`
devroller2
  • 浏览: 33855 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Roller如何缓存页面

阅读更多

前面的文章已经谈了roller是如何生成页面的,其实页面就是一些HTML代码。在roller中,使用一个类CachedContent对象来包装这些HTML代码,然后才把CachedContent对象放到缓存中以便以后使用。

 

谈到缓存,roller的开发者们绝不会放过任何一个提高性能的机会。首先利用浏览器的缓存功能,见如下代码:

            if (ModDateHeaderUtil.respondIfNotModified(request, response, lastModified)) {
                return;
            } else {
                // set last-modified date
                ModDateHeaderUtil.setLastModifiedHeader(response, lastModified);
            }

 

 

接下来谈谈roller如何为了提高性能如何利用内存来实现缓存的。这里说的主要针对博客页面的缓存处理。为了叙述方便,下面的是笔者根据源代码整理的类图:

 

 

在图中,有两个单例类,分别是CacheManagerWeblogPageCache。其中WeblogPageCache有一个Cache属性,在实例化时通过CacheManager实例获取一个Cache对象。

 

CacheManager实例化时要通过读取属性文件来初始化cacheFactory属性,默认情况下cacheFactory是一个ExpiringLRUCacheFactoryImpl对象。这里应用了工厂模式。

 

通过图中我们可以知道WeblogPageCachecontentCache属性实际是一个ExpiringLRUCacheImpl对象。

 

我们知道缓存很好用,put进去get出来。看起来简单,但真正的缓存系统要做很多工作,比如是否过期了,如何清理缓存等等。

 

Roller中定义了一个Cache接口,代表一个缓存。有两个实现类,分别是LRUCacheImplExpiringLRUCacheImpl,他们是父子关系。实现了LRU算法的缓存策略。作为缓存接口自然少不了这几个重要的方法:putgetremoveclear

 

WeblogPageCache类为我们屏蔽了很多实现细节,如果是作为缓存的使用者,只要了解WeblogPageCacheAPI就可以了。WeblogPageCache同样也有和Cache类似的方法,这些对应的方法其实是把请求委派给Cache来处理。WeblogPageCache还有一个重要的方法generateKey,生产key很重要,但笔者不打算在这里讲。

 

通过类图和前面的文字介绍,我们可以知道系统是如何准备好缓存等待我们使用的了。

 

前面提到html被包装到CachedContent对象中,当页面需要缓存时,WeblogPageCacheput方法被调用,传入一个keyCachedContent对象。同时new一个LazyExpiringCacheEntry对象来包装CachedContent。为什么这样做呢?目的是为了在get时判断数据是否有效。

 

先说说本人对缓存的两个概念(有效和过期)的理解。有效是指被缓存的数据已经被修改过了;过期是指当被缓存的数据超过了缓存系统设定的时间长度。

 

WeblogPageCacheput时,其实是把请求委派给Cache对象的,而这个Cache就是一个ExpiringLRUCacheImpl对象。ExpiringLRUCacheImplput方法被调用时,又new了一个ExpiringCacheEntry对象来包装LazyExpiringCacheEntry对象。这样做的目的是为了在get时判断被缓存数据是否过期。

 

缓存的put过程就是这样的,下面说说如何从缓存中取出数据,取出数据是通过调用get方法。

 

 

当想获取一个缓存数据时需要调用WeblogPageCacheget方法,此方法需要传入一个key和一个博客最近修改时间。Get的过程不是很好描述。WeblogPageCache把请求传给Cache对象上的get方法。在Cacheget方法中通过keyMap中取出value,这个value先是一个ExpiringCacheEntry对象,因为此对象被new时初始化了超时时间和缓存时间。所以通过

    public boolean hasExpired() {
        
        long now = System.currentTimeMillis();
        
        return ((this.timeCached + this.timeout) < now);
    }

 

可以判断一个数据是否过期。如果过期就被从缓存中删除了,否则就从ExpiringCacheEntry中取出value(也就是LazyExpiringCacheEntry)返回。

 

一个数据不过期并不代表能使用,还要判断他是否有效。程序控制权回到WeblogPageCacheget方法。如果Cacheget方法不是null,就要判断是否有效。LazyExpiringCacheEntry对象被new出来时,它的被缓存时间也同时被初始化。由于它是包装CachedContent对象的,因此它也有个get方法,参数是最近修改时间。在此方法中,通过判断最近时间是否大于缓存时间来确定数据是否有效。

 

如果数据是有效的就把CachedContent返回,否则就返回null。整个缓存的get过程就这样结束了。

 

体会:roller的缓存用了工厂模式,这样的好处是:当我们的站点规模变大时,roller缓存可能满足不了要求,这时如果使用优秀的缓存系统(比如memcached)是比较容易集成到roller中的。

 

欢迎大家一起讨论roller。。。。。。 

 

分享到:
评论
3 楼 devroller2 2010-12-20  
什么编辑器啊,画图的吗,我是用rose画的,导出图片上传到je,再插入图片
2 楼 wenxiang_tune 2010-12-20  
楼主强大,类图都画出来了,鼓励,支持。但是我想问问,那个编辑器如何弄进去,我本地没有编辑器。
1 楼 Javakeith 2010-10-19  
搂主,请继续!

相关推荐

    roller

    NULL 博文链接:https://moving200x.iteye.com/blog/1749902

    Apache Roller

    Apache Roller是一个全功能,多用户和组博客服务器,适合大型和小型博客网站。它运行一个Java Web应用程序应该能够运行在任何Java EE服务器和关系数据库。目前,Apache Roller能很好的支持Tomcat和MySQL。 本人用...

    开源Java博客Roller v5.0 for tomcat.zip

    它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。目前的最新版本是5.0。 Roller v5.0更新说明: Media blogging ...

    Safety evaluation of table liner for vertical roller mill

    Safety evaluation of table liner for vertical roller mill by modified fatigue limit

    roller-part01

    apache-roller-srapaapache-roller-srcche-roller-srccapache-rolaapache-roller-srcpache-roller-srcler-srcapapache-roller-srcache-roller-srcapache-roller-src

    roller-part2

    apache-rollapachapache-roller-srce-roller-srcer-srcapache-rolleapacapache-roller-srche-roller-srcr-srcapache-roapache-roller-srcller-srcapache-roller-src

    apache-roller-src

    apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src apache-roller-src

    roller安装

    NULL 博文链接:https://jarorwar.iteye.com/blog/554942

    roller安装指南电子书

    apache roller安装指南电子书 翻译官方roller安装帮助文档

    开源Java博客Roller v5.0 for tomcat

    它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。目前的最新版本是5.0。Roller v5.0更新说明:Media blogging ...

    Roller4.0的另外一套cas简单解决方案

    Roller4.0的另外一套cas简单解决方案. 最近在使用roller4.0和cas的单点登录集成.中间碰到了很多很多的问题.也许我碰到的问题都是属于自己的技术不成熟,能力不够引起的.但是我想应该还是有很多人和我是差不多的吧.我...

    roller-weblogger.rar

    weblogging 设计比较精巧,是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。 最主要是其开源

    roller install、user、template guide

    roller install guide roller user guide roller template guide

    Apacheroller

    install the roller 讲述怎样使用roller

Global site tag (gtag.js) - Google Analytics