页面片段缓存方案介绍(OSCache,Velocity自定义标签,Varnish+ESI)
来源:互联网 发布:淘宝怎么找收藏的店铺 编辑:程序博客网 时间:2024/05/16 12:32
1.OSCache
OSCache是一个使用较多的高性能J2EE缓存框架,适用于任何JAVA应用程序的普通缓存解决方案。可以不受限制的缓存部分jsp页面或http请求;支持永久缓存,将缓存内存随意写入硬盘;支持集群-集群缓存数据,而不需要修改代码;控制缓存对象过期时间,可插入式刷新策略;
oscache-2.1.jar;commons-logging-api-1.1.jar;log4j-1.2.11.jar
配置OSCache环境
CacheFilter只对http 200的页面请求做处理,不对其他状态做缓存处理
web.xml
oscache.properties
目前新版本的OSCache已经支持集群分布式
实现分布式环境消息同事,目前比较流行的2中做法:1.JavaGroups[http://www.jgroups.org/];2.JMS 这2种底层都实现了广播通信。
采用javaGroup,我们可以看下官方文档,使用下面的方式配置
拷贝oscache.tld到WEB-INF下
//index.jsp,用来刷新指定页面缓存
//newinfo.jsp 页面缓存内容
cache标签(其他属性使用可以在官方文档上查阅或者http://praguesky.blog.163.com/blog/static/232970042007415731504/)
这是OSCache提供的标签库中最重要的一个标签,包括在标签中的内容将应用缓存机制进行处理,处理的方式将取决于编程者对cache标签属性的设置。
第一次请求到达时,标签中的内容被处理并且缓存起来,当下一个请求到达时,缓存系统会检查这部分内容的缓存是否已经失效,主要是以下几项:
(1)缓存时间超过了cache标签设置的time或者duration属性规定的超时时间
(2)cron属性规定的时间比缓存信息的开始时间更晚
(3)标签中缓存的内容在缓存后又被重新刷新过
(4)其他缓存超期设定
如果符合上面四项中的任何一项,被缓存的内容视为已经失效,这时被缓存的内容将被重新处理并且返回处理过后的信息,如果被缓存的内容没有失效,那么返回给用户的将是缓存中的信息。
cache标签的常用属性说明:
key
标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。可以在同一个页面中使用很多cache标签而不指定他的key属性,这种情况下系统使用该页面的URI和后面的请求字符串,另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。
scope
缓存发生作用的范围,可以是application或者session。默认为application。
time
缓存内容的时间段,单位是秒,默认是3600秒,也就是一个小时,如果设定一个负值,那么这部分被缓存的内容将永远不过期。
duration
指定缓存内容失效的时间,是相对time的另一个选择,可以使用简单日期格式或者符合USO-8601的日期格式。如:duration='PT5M' duration='5s'等。
cron
指定缓存内容失效表达式,见“Cron表达式基本语法”。
refresh
false 或者true。如果refresh属性设置为true,不管其他的属性是否符合条件,这部分被缓存的内容都将被更新,这给编程者一种选择,决定什么时候必须刷新。
mode
如果不希望被缓存的内容增加到给用户的响应中,可以设置mode属性为"silent"。此时被缓存的部分不在页面上显示,而其它任意的mode属性值都会将缓存的部分显示到页面上。
groups
指定当前cache标签所属的组,可使用“,”分割组名。这样就可以对缓存项进行分组了。如果缓存项依赖于应用的其它部分或其它数据,分组就有了用武之地——当这种依赖改变时(刷新相关的组),这个组的所有缓存项都将过期。
language
使用ISO-639定义的语言码来发布不同的缓存内容(under an otherwise identical key)。要在一个多语言网站上同一段JSP代码不同用户的参数提供不同的语言时,这个属性会很有用。
refreshpolicyclass
指定自定义的刷新策略类的全限定类名。这个类继承自com.opensymphony.oscache.web.WebEntryRefreshPolicy
refreshpolicyparam
指定任意需要传给refreshpolicyclass的参数。如果没有指定refreshpolicyclass,则这个值不起作用。
这些属性可以单独使用,也可以根据需要组合使用。
2.Velocity
http://news.cnblogs.com/n/100285/
3.Varnish+ESI
varnish安装
wget http://repo.varnish-cache.org/source/varnish-2.1.5.tar.gz
tar xzvf varnish-2.1.5.tar.gz
./configure -prefix=/usr/local/varnish
make
make install
如果提示缺少 'libpcre'
yum -y install automake autoconf libtool ncurses-devel libxslt groff pcre-devel pkgconfig
varnish自己并没有提供服务,只是一个缓存服务器(Squid???)
Varnish的默认配置文件在/usr/local/varnish/etc/varnish/default.vcl(这个配置文件指示所使用的后端服务器)
./sbin/varnishd -a 0.0.0.0:80 -f /usr/local/varnish/ect/varnish/default.vcl -s malloc,500M
//welcome.jsp
//esi.jsp
对于<esi:include src="http://192.168.0.100:8080/oscache_test/welcome.jsp"/>在这种情况varnish会做esi解析,但没有缓存下来
varnish将所有的object存于一个单独的大文件中,在工作进程初始化时候这个文件就会被加载到内存中。varnish在内存中的实现和“文件系统”有点相似,具有分配、释放、修剪、合并等功能;这种设计避免了软件与系统对内存控制的冲突;像squid、oscache会将每个object存在一个小文件,相对来说,varnish的大文件可以减少文件系统频繁的操作,这就需要记录每个object在内存的偏移量,定期检查释放内存,编程难度增加,却可以提高性能。
ps -aux|grep "varnish"
我们可以看到varnish启动或有2个进程 master(management)进程和child(worker)进程。master读入存储配置命令,进行初始化,然后fork,监控child。child则分配线程进行cache工作,child还会做管理线程和生成很多worker线程。
child进程主线程初始化过程中,将存储大文件整个加载到内存中,如果该文件超出系统的虚拟内存,则会减少原来配置mmap大小,然后继续加载,这时候创建并初始化空闲存储结构体,放在存储管理的struct中,等待分配。
接着,varnish某个负责接口新http连接的线程开始等待用户,如果有新的http连接,但是这个线程只负责接收,然后唤醒等待线程池中的work线程,进行请求处理。
worker线程读入uri后,将会查找已有的object,命中直接返回,没有命中,则会从后端服务器中取出来,放到缓存中。如果缓存已满,会根据LRU算法,释放旧的object。
对于释放缓存,有一个超时线程会检测缓存中所有object的生命周期,如果缓存过期(ttl),则删除,释放相应的存储内存。
存储结构体(定义在varnish/bin/varnishd/strorage_file.c)
基本结构体,缓存文件中一小块连续的内存,用来分配相应大小的http object(定义在strorage_file.c)
- 页面片段缓存方案介绍(OSCache,Velocity自定义标签,Varnish+ESI)
- ESI+varnish页面片段缓存
- 页面片段缓存----使用esi标签
- Varnish+ESI实现静态页面的局部缓存
- 使用Varnish+ESI实现静态页面的局部缓存
- 使用Varnish+ESI实现静态页面的局部缓存
- 页面片段缓存----基于velocity
- ESI(分段页面缓存)
- 使用JSP自定义标签做页面片段的缓存
- OSCache缓存方案
- Web缓存(Varnish方案)
- Web缓存(Varnish方案)
- Web缓存 --- Varnish方案
- OSCache页面缓存
- OSCache-JSP页面缓存
- 页面缓存OSCache
- 页面缓存OSCache
- OSCache页面缓存
- 正则表达式30分钟入门教程
- DataTable批量插入数据库
- 积累
- X Window 设定介绍
- shell对参数操作 字符串操作
- 页面片段缓存方案介绍(OSCache,Velocity自定义标签,Varnish+ESI)
- php操作dba的总结笔记
- Android开发-交叉编译问题
- 试题一
- 正则表达式
- c++ 文件复制 往文件中输入字符、数字、字符串
- javascript无提示关闭窗口之二:跨浏览器
- 嵌入式工程必须知道的0x10个问题
- Mencoder 如何平滑降低帧率