Velocity缓存与穿透(转)
总评:只是标记一下这种用法hack方法。这种场景下用这种方法还是比较雷人的。
/**
*原创:
*Author:Water.DH(黄俊杰)
*Date :2010-04-18*/
前言:
Velocity作为一款简单易用的web应用模板框架,深受广大java开发者的喜爱,更多资讯使用搜索"Velocity";来获得。
场景:
Web应用在开发阶段,是不需要配置velocity缓存的,这样修改了vm模板后可以立马生效,调试起来也比较方便。正式上线后,为了提升性能,我们还是需要开启Velocity缓存,这样vm模板不需要每次访问的时候重新编译,直接从vm缓存中获取。经过测试,在大型Web应用中cpu负载可以降低10%左右。
配置:
web应用中velocity.properties中增加配置如下:
resource.loader=file
file.resource.loader.class=org.apache.velocity.tools.view.servlet.WebappLoader
file.resource.loader.cache=true //缓存开关
file.resource.loader.modificationCheckInterval=3600 //单位秒
模板缓存1小时。
问题:
很好,现在我们web应用都加上了velocity缓存了,但是页面公共部分有了小修改(比如顶部导航),本来只要发布一个vm模板文件就可以了, 但是为了让模板立马生效,我还得重新启动web服务, 一台两台还好说,我靠,可是如果涉及多个应用和几百台服务器呢?
方案:
把公用的vm模板打上版本号,通过中间的系统管理起来,有了更新后,发送消息给相应的web应用。
web应用这时候要比对版本号,看是否要从中间系统中拉最新的版本内容。
OK,拉到新的模板了,怎么样利用起来呢?
velocity语言中,有个#parse("/WEB-INF/tpl/xxx.vm")函数,用于载入指定路径下的vm文件,这时候我们通过注入工具类的方式,来动态替换这个路径。
比如:
#parse($tool.getPath(xxx.vm));
那其实$tool.getPath(xxx.vm)输出的是带版本号的新地址"/WEB-INF/tpl/xxx_v1102.vm",这样就达到了透过vm缓存的效果。
我们把工具类整合成一个客户端,实现新版本获取,历史文件管理,脱机管理,高并发优化等功能,达到了既不影响性能又简便地集中控制发布的目的。
http://www.tuicool.com/articles/f6Rz63
Velocity缓存与穿透(转)的更多相关文章
- (转)面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题
背景:redis问题在面试过程中经常被问到,对于常见问题一定不能放过. 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题 一.缓存雪崩 1.1什么是缓存雪崩? 如果缓存数据设置的过 ...
- 什么是redis的缓存雪崩, 穿透, 击穿?
目前的互联网系统没有几个不使用缓存的, 但是只要使用缓存的话就会面临这几个问题, 如使用redis缓存技术, 可能会遇到缓存的雪崩, 穿透, 以及击穿. 首先来看一个简单的正常缓存流程: 如用户访问J ...
- 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题
今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis ...
- REDIS 缓存的穿透,雪崩和热点key
穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法:①用一个bitmap和n个hash函数做布隆过滤器过滤没有在缓存的键. ②持久层查询不到就 ...
- NoSQL:Redis缓存、雪崩、击穿、穿透
Redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库 ...
- 再谈缓存和Redis
自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...
- redis结合自定义注解实现基于方法的注解缓存,及托底缓存的实现
本次分享如何使用redis结合自定义注解实现基于方法的注解缓存,及托底缓存的实现思路 现在的互联网公司大多数都是以Redis作为缓存,使用缓存的优点就不赘述了,写这篇文章的目的就是想帮助同学们如 ...
- varnish与squid缓存效率对比实例
前提:安装varnish.squid.webbench(压测工具) 注:varnish和squid机都未安装其他多余服务,服务器绑定域名为www.dannylinux.top (为同一台服务器,测试 ...
- redis的雪崩与穿透原理的浅理解
首先列一下主要说什么, 1.什么是Redis缓存的雪崩? 2.什么是Redis缓存的穿透? 3.Redis缓存崩溃会怎么样? 4.怎么预防Redis缓存崩溃? 1.什么是Redis缓存的雪崩? 举个栗 ...
随机推荐
- Excel单元格内容太多会覆盖遮住下一单元格范围
Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设 ...
- ajax后台处理返回json值
public ActionForward xsearch(ActionMapping mapping, ActionForm form, HttpServletRequest request, Htt ...
- session对象和applicatione对象
ASP.NET 的常用对象有:response对象.request对象.application对象.server对象.session对象.下面主要讨论session对象和cookie对象. sessi ...
- delphi 网页提交按钮执行点击事件
遍历即可实现,下列代码仅供参考: var i: integer; T: OleVariant; begin T := WebBrowser1.Document; do begin if T.all.i ...
- 陈年查尔斯们,请考虑下记者们的感受 by 李斌
http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5ODUxNTQwMA==&appmsgid=10000507&itemidx=2&am ...
- form表单标签的enctype属性的作用
Enctype是指定将数据回发到server时浏览器使用的编码类型.其编码类型有下面三种 一. application/x-www-form-urlencoded 这是通过表单发送数据 ...
- [Android学习笔记]View的draw过程学习
View从创建到显示到屏幕需要经历几个过程: measure -> layout -> draw measure过程:计算view所占屏幕大小layout过程:设置view在屏幕的位置dr ...
- linux 查看某进程或程序的网卡流量(转)
一.nethogs介绍 分享一个linux 下检测系统进程占用带宽情况的检查.来自github上的开源工具. 它不依赖内核中的模块.当我们的服务器网络异常时,可以通过运行nethogs程序来检测是那个 ...
- JavaScript 中的继承(读书笔记思维导图)
继承是 OO 语言中的一个最为人津津乐道的概念.许多 OO 语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.由于函数没有签名,在 ECMAScript ...
- hdu2066一个人的旅行(dijkstra)
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...