总评:只是标记一下这种用法hack方法。这种场景下用这种方法还是比较雷人的。

Velocity缓存与穿透

/**

*原创:

*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缓存与穿透(转)的更多相关文章

  1. (转)面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题

    背景:redis问题在面试过程中经常被问到,对于常见问题一定不能放过. 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题 一.缓存雪崩 1.1什么是缓存雪崩? 如果缓存数据设置的过 ...

  2. 什么是redis的缓存雪崩, 穿透, 击穿?

    目前的互联网系统没有几个不使用缓存的, 但是只要使用缓存的话就会面临这几个问题, 如使用redis缓存技术, 可能会遇到缓存的雪崩, 穿透, 以及击穿. 首先来看一个简单的正常缓存流程: 如用户访问J ...

  3. 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题

    今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis ...

  4. REDIS 缓存的穿透,雪崩和热点key

    穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法:①用一个bitmap和n个hash函数做布隆过滤器过滤没有在缓存的键.   ②持久层查询不到就 ...

  5. NoSQL:Redis缓存、雪崩、击穿、穿透

    Redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库 ...

  6. 再谈缓存和Redis

    自从上次分享<Redis到底该如何利用?>已经有1年多了,这1年经历了不少.从码了我们网站的第一行开始到现在,我们的缓存模块也不断在升级,这之中确实略有心得,最近也有朋友探讨缓存,觉得可以 ...

  7. redis结合自定义注解实现基于方法的注解缓存,及托底缓存的实现

    本次分享如何使用redis结合自定义注解实现基于方法的注解缓存,及托底缓存的实现思路    现在的互联网公司大多数都是以Redis作为缓存,使用缓存的优点就不赘述了,写这篇文章的目的就是想帮助同学们如 ...

  8. varnish与squid缓存效率对比实例

    前提:安装varnish.squid.webbench(压测工具) 注:varnish和squid机都未安装其他多余服务,服务器绑定域名为www.dannylinux.top  (为同一台服务器,测试 ...

  9. redis的雪崩与穿透原理的浅理解

    首先列一下主要说什么, 1.什么是Redis缓存的雪崩? 2.什么是Redis缓存的穿透? 3.Redis缓存崩溃会怎么样? 4.怎么预防Redis缓存崩溃? 1.什么是Redis缓存的雪崩? 举个栗 ...

随机推荐

  1. JavaScript函数节流与函数去抖

    介绍 首先解释一下这两个概念: 函数节流(throttle):是让一个函数无法在很短的时间间隔内连续调用,当上一次函数执行后过了规定的时间间隔,才能进行下一次该函数的调用. 函数去抖(debounce ...

  2. poj 3211 Washing Clothes(背包)

    很不错的01背包!!! 不过有点疑问!!!(注释) #include <algorithm> #include<stdio.h> #include<string.h> ...

  3. Swift - 异步获取网络数据封装类

    使用NSURLConnection.sendAsynchronousRequest()可以采用异步获取的方式取得数据.下面通过对数据获取类进行封装,演示如何进行数据请求与接收. 1,HttpContr ...

  4. 插件 - 提示窗体(ArtDialog)

    效果: 代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default. ...

  5. 【自由谈】城域网IPv6过渡技术——MAP技术(4)

    本节接着回答MAP技术的第三个问题:“MAP-BR的Pool是如何实现?可靠性如何提升?” 在MAP域中通过将多个MAP-BR放在同一个Pool内实现负载分担和保护倒换的.同一个Pool中的每个MAP ...

  6. LeetCode——Count and Say

    The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111221 ...

  7. ssh登录过程详细介绍

    服务器端和客户端就取得了相同的会话密钥和会话 ID .对于后续传输的数据,两端都会使用会话密钥进行加密和解密,保证了数据传送的安全. http://blog.csdn.net/lhq9220/arti ...

  8. 使用函数指针和多态代替冗长的if-else或者switch-case

    在编程中,if-else和switch-case是很常见的分支结构,很少在程序中不用这些控制语句.但是不能否认,在一些场景下,由于分支结构过分长,导致代码不美观且不容易维护,在<重构>一书 ...

  9. SLB 权重问题

    <pre name="code" class="html">一般配置SLB的时候有个权重0到100,是如何选择数值的? 权重需要您根据后端机器的配置 ...

  10. 计算机视觉与模式识别代码合集第二版three

    计算机视觉与模式识别代码合集第二版three     Topic Name Reference code Optical Flow Horn and Schunck's Optical Flow   ...