针对动态内容的处理, 这是个很大的话题。 这个涉及到网站的前端架构规划、后端架构规划,还涉及到缓存策略。前端架构规划也是个复杂问题,近年来越来越多的网站开始注重这一块。先说简单的,介绍一下目前一些流行的缓存策略。
缓存的主要思想
利用内存或者文件等存储,对于经常用到的数据进行缓存,以提高系统性能
一、针对页面或页面碎片的缓存: OSCache介绍
1、被处理的内容短时间不变,所以短时间内可以作为静态内容进行处理
2、在一个不太长的时间内,被处理的内容可能或者必定产生变化,所以必须将他们作为动态内容进行处理
3、在合理的时间区段内可以忽略被处理内容变化后带来的影响
4、对这些内容的处理动作比较消耗系统性能,影响系统响应时间
缓存页面碎片:数据的内容短时间内是不会发生变化的,但是在一个相对长一些的时间里,它却可能是动态增加或者减少的。
缓存页面:统计报表是一个周期性的工作,可能是半个月、一个月或者更长的时间才会需要更新一次,然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件,这些图形内容、文件的生成通常需要消耗很多的系统资源,给系统运行造成很大的负担。
OSCache缓存的实际工作流程
1、缓存信息
第一次被访问时,被处理的内容被当作动态信息,基础数库从数据库中获得,放入缓存信息中。
2、响应信息由缓存提供
继续被访问时,系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则,如果符合缓存信息存在而且符合缓存规则,给出的响应将来自于缓存信息,如果没有或者缓存信息已经不符合设定的要求,系统将重复步骤1
很显然,上面的步骤2中,多数情况下,当用户请求到达时,被处理的内容将来自于缓存,所以大大的减少了与数据库的交互,或者不再需要为每个请求都生成一次报表图形或者文件,这部分工作的减少对于降低系统性能消耗、提高系统稳定性和并发处理能力是非常有益的。
OSCache特点
1. 兼容多种支持JSP的web服务器
2. 可以使用内存和硬盘作为缓存区
3. 灵活的缓存设置
OSCache的安装
1. 下载OSCache
2. 将主要组件%OSCache_Home%\oscache.jar放入WEB-INF\lib目录
3. 需要commons-logging.jar、commons-collections.jar
4. 将oscache.properties、oscache.tld放入WEB-INF\class目录
%OSCache_Home%\oscache.properties包含了对OSCache运行特征值的设置信息
%OSCache_Home%\oscache.tld包含了OSCache提供的标签库的定义内容
5. 修改web.xml文件
在web.xml文件中增加下面的内容,增加对OSCache提供的taglib的支持:
<taglib>
<taglib-uri>oscache</taglib-uri>
<taglib-location>/WEB-INF/classes/ oscache.tld</taglib-location>
</taglib>
1. OSCache对于页面碎片进行缓存
OSCache缓存页面碎片用到的主要标签
key - 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。
scope - 缓存发生作用的范围,可以是application或者session
time - 缓存内容的时间段,单位是秒,默认是3600秒,也就是一个小时,如果设定一个负值,那么这部分被缓存的内容将永远不过期。
duration - 指定缓存内容失效的时间,是相对time的另一个选择,指定使用日期,如:duration=‘PT5M’ duration=‘5s’等
refresh – 是否失效
OSCache缓存页面碎片的实例
<cache:cache key=“teacher2323" time=“1800”>
<% //自己的JSP代码内容 %>
</cache:cache>
<cache:cache key=“schools“ time=“-1”>
<% //自己的JSP代码内容 %>
</cache:cache>
<cache:cache key="<%= product.getId() %>" time="1800" refresh="<%= needRefresh %>">
<% //自己的JSP代码内容 %>
</cache:cache>
2. OSCache对于页面文件进行缓存
修改web.xml,增加如下内容,确定对/testContent.jsp页面进行缓存。
<filter>
<filter-name>CacheFilter</filter-name>
<filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CacheFilter</filter-name>
<url-pattern>/testContent.jsp</url-pattern>
</filter-mapping>
二、针对数据及查询结果集的缓存: EHCache介绍
- 一个从 Hibernate 发展而来的Cache开源项目
- 可用来存储数据(而不含展现)
- 可与hibernate结合存储结果集
- 通过对象序列化,可存储对象
总的来说,EHCache可看做类似HashMap。 缓存与HashMap的最大不同,就是缓存设想内存是有限的,缓存的时效性也是有限的,所以可以设定内存数量的大小,可以执行失效算法 ,可以在内存满了的时候,按照最少访问等算法将数据从缓存中移除。
一些特点:
1 对象在内存中的最大数量
2 到达内存中最大量时的过期/移出算法
3 可储存到硬盘
4 重启时缓存持久化
实现流程、安装、示例等略
三、分布式缓存服务器 -- memcached
协议简单: memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。下面是例子。
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)
基于libevent的事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
内置内存存储方式
数据仅存在于内存。
因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
个人认为,有利有弊。主要弊端,不能一次全部重启所有cache server,否则,很难做cache内容的初始化。当然也有解决方法,比如重启后,自己写程序初始化一些数据。
memcached不互相通信的分布式

mixi、Facebook、twitter、新浪博客等都采用了memcached或其变种
由于历史原因,有些门户仍自己实现了分布式缓存
实现流程、安装、示例等略
memcached与搜狐博客分布式缓存框架的比较,此处略去若干字,有待某些人补充,呵呵


档案
日志
相册
视频



评论
想第一时间抢沙发么?