页面片段“.NET研究”缓存(一)
2011-10-19 19:38
99 查看
一般,页面上会分为很多部分,而不同的部分更新的频率是不一样的。如果对整个页面采用统一的缓存策略则不太合适,
而且很多系统的页面左上角都有一个该死的“Welcome XXX”。这种特定于用户的信息我们是不能缓存的。对于这些情况我们就需要使用片段缓存了。对页面不同的部分(片段)施加不同的缓存策略,而要使用片段缓存,首先就得对页面进行切分。土一点的办法可以用iframe,用iframe将页面划分为一块块的,不过我总觉得iframe是个邪恶的东西。好点的办法可以用Ajax单独的请求这个片段的内容然后再填充,看起来挺美好的。不过使用Ajax也有一些限制:
1、如果页面上有许多片段,使用太多的这种技术,会有很多请求发送到服务器,HTTP对同一个域名有连接的限制,这样会降低并发连接的效率。
2、如果说第一个不是什么问题,那么还有一点可能对用户体验不友好。比如有一个片段可能响应慢点,造成页面闪烁。不过如果前面两点都可以克服,这个上海徐汇企业网站设计与制作方案还是可以的。可恶的是我们的客户(此处省略500字),说他们的大多数用户处于一个禁用JavaScript的环境里。好吧,这个方案也不能使用了。如是我们进行了一系列其他关于片段缓存的尝试:
我们的系统使用的是Spring+Hibernate+Oracle技术,模板引擎使用的是Apache Velocity。假设下面的片段是我们要缓存的内容:
[/code]
由于一个页面可能有很多片段,不同的片段肯定要用不同的cache key,所以这个标签应该还能传入一个cache key。当呈现这个页面,到解析这个标签的时候我们就用这个cache key去缓存中取,如果取到了我们就直接将缓存的东西输出,
而不再需要解析这个图书列表了。
有了这个想法,我们就需要找到如何让Velocity解析我们的标签的方案。很好,Velocity是支持自定义标签的:
[/code]
那么在cache标签内部呢:
这样就可以计算出$pageIndex==1这个表达式的结果(当然,$pageIndex这个变量是需要传入进来的)。
好了,编写好自定义标签的代码我们可以使用了。而并不是我们写好这代码往那儿一丢就可以使用了,还需要一个配置环节:
好了,这么一个利用Velocity的片段缓存就完成了。但是这种方式也存在一些问题,给我们带来了一些bug。
1、有的时候我们会在片段里set一些变量,然后在这个片段外使用。但是现在使用了cache之后,cache之后的是HTML
文本,这些变量全部消失了,那么片段外也取不到这些变量的值了。那我们就需要仔细搜查Velocity模板,将这些变量的使用全部移动到片段内部。如果是一开始就设计了这个片段缓存还好,我们可以注意这个问题。但问题是现在是项目的中途提出的,系统中velocity模板成千上万,我们每缓存一个片段就要仔细检查一番,而且Velocity模板没有测试(当然可以写测试,但很麻烦)。这个过程全部靠人肉,所以出bug的几率会很高。
2、还是一样,改动比较大,不仅模板,后面的控制器也需要修改。不过貌似也没什么更好的方法,要使用片段缓存貌似改动是避免不了的。
页面片段缓存(二)
而且很多系统的页面左上角都有一个该死的“Welcome XXX”。这种特定于用户的信息我们是不能缓存的。对于这些情况我们就需要使用片段缓存了。对页面不同的部分(片段)施加不同的缓存策略,而要使用片段缓存,首先就得对页面进行切分。土一点的办法可以用iframe,用iframe将页面划分为一块块的,不过我总觉得iframe是个邪恶的东西。好点的办法可以用Ajax单独的请求这个片段的内容然后再填充,看起来挺美好的。不过使用Ajax也有一些限制:
1、如果页面上有许多片段,使用太多的这种技术,会有很多请求发送到服务器,HTTP对同一个域名有连接的限制,这样会降低并发连接的效率。
2、如果说第一个不是什么问题,那么还有一点可能对用户体验不友好。比如有一个片段可能响应慢点,造成页面闪烁。不过如果前面两点都可以克服,这个上海徐汇企业网站设计与制作方案还是可以的。可恶的是我们的客户(此处省略500字),说他们的大多数用户处于一个禁用JavaScript的环境里。好吧,这个方案也不能使用了。如是我们进行了一系列其他关于片段缓存的尝试:
我们的系统使用的是Spring+Hibernate+Oracle技术,模板引擎使用的是Apache Velocity。假设下面的片段是我们要缓存的内容:
[code]#cache <ul> #foreach($book in $books) <li><a href="/book/books/$book.id">$book.name</a>---<a href="/book/books/edit/$book.id">Edit</a> -- <a href="/book/books/delete/$book.id">Delete</a></li> #end </ul> #end
[/code]
由于一个页面可能有很多片段,不同的片段肯定要用不同的cache key,所以这个标签应该还能传入一个cache key。当呈现这个页面,到解析这个标签的时候我们就用这个cache key去缓存中取,如果取到了我们就直接将缓存的东西输出,
而不再需要解析这个图书列表了。
有了这个想法,我们就需要找到如何让Velocity解析我们的标签的方案。很好,Velocity是支持自定义标签的:
[code]#cache("book_list",$pageIndex==1,$dataProvider) ... #end
[/code]
那么在cache标签内部呢:
Node needCacheNode = node.jjtGetChild(1); Boolean needCache = (Boolean) needCacheNode.value(context); String cacheHtml 上海企业网站制作pan>= StringUtils.EMPTY; if (needCache) { cacheHtml = (tring) CacheManager.getInstance().get(cacheKey); }
这样就可以计算出$pageIndex==1这个表达式的结果(当然,$pageIndex这个变量是需要传入进来的)。
好了,编写好自定义标签的代码我们可以使用了。而并不是我们写好这代码往那儿一丢就可以使用了,还需要一个配置环节:
<bean 上海闵行企业网站制作0000;">class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/templates/"/> <property name="velocityProperties"> <props> <prop key="userdirective">com.yuyijq.web.Cache</prop> </props> </property> </bean>
好了,这么一个利用Velocity的片段缓存就完成了。但是这种方式也存在一些问题,给我们带来了一些bug。
1、有的时候我们会在片段里set一些变量,然后在这个片段外使用。但是现在使用了cache之后,cache之后的是HTML
文本,这些变量全部消失了,那么片段外也取不到这些变量的值了。那我们就需要仔细搜查Velocity模板,将这些变量的使用全部移动到片段内部。如果是一开始就设计了这个片段缓存还好,我们可以注意这个问题。但问题是现在是项目的中途提出的,系统中velocity模板成千上万,我们每缓存一个片段就要仔细检查一番,而且Velocity模板没有测试(当然可以写测试,但很麻烦)。这个过程全部靠人肉,所以出bug的几率会很高。
2、还是一样,改动比较大,不仅模板,后面的控制器也需要修改。不过貌似也没什么更好的方法,要使用片段缓存貌似改动是避免不了的。
成熟的方案
片段缓存应该是大型系统里经常采用的,那么就应该有一些成熟的方案。我们为何不寻找那些成熟的方案要重新制造轮子呢。这个方案就是ESI,在下一篇文章中我会介绍结合Varnish和ESI来做片段缓存。页面片段缓存(二)
相关文章推荐
- 一起谈.NET技术,页面片段缓存(一)
- “.NET技术”页面片段缓存(二)
- 页“.NET研究”面片段缓存(二)
- 一起谈.NET技术,页面片段缓存(二)
- 页面片段缓存(二)
- .net 页面输出缓存设置
- 页面片段缓存----使用esi标签
- 使用JSP自定义标签做页面片段的缓存
- 页面片段缓存(二)
- .net页面缓存
- 页面片段缓存方案介绍(OSCache,Velocity自定义标签,Varnish+ESI)
- .net页面缓存
- 页面片段缓存(一)
- .net页面缓存
- ESI+varnish页面片段缓存
- 页面片段缓存(二)
- “.NET研究”带你走进缓存世界
- 页面片段缓存(一)
- .net 防止页面刷新重复提交(表单提交后保留上一次数据缓存,刷新提交)
- ESI+varnish页面片段缓存