【java】java⾼并发解决⽅案和⾼负载优化⽅法
⼀个⼩型的⽹站,⽐如个⼈⽹站,可以使⽤最简单的html静态页⾯就实现了,配合⼀些图⽚达到美化效果,所有的页⾯均存放在⼀个⽬录下,这样的⽹站对系统架构、性能的要求都很简单,随着互联⽹业务的不断丰富,⽹站相关的技术经过这些年的发展,已经细分到很细的⽅⽅⾯⾯,尤其对于⼤型⽹站来说,所采⽤的技术更是涉及⾯⾮常⼴,从硬件到软件、编程语⾔、数据库、WebServer、防⽕墙等各个领域都有了很⾼的要求,已经不是原来简单的html静态⽹站所能⽐拟的。
⼤型⽹站,⽐如门户⽹站。在⾯对⼤量⽤户访问、⾼并发请求⽅⾯,基本的解决⽅案集中在这样⼏个环节:使⽤⾼性能的服务器、⾼性能的数据库、⾼效率的编程语⾔、还有⾼性能的Web容器。但是除了这⼏个⽅⾯,还没法根本解决⼤型⽹站⾯临的⾼负载和⾼并发问题。
上⾯提供的⼏个解决思路在⼀定程度上也意味着更⼤的投⼊,并且这样的解决思路具备瓶颈,没有很好的扩展性,下⾯我从低成本、⾼性能和⾼扩张性的⾓度来说说我的⼀些经验。
1、HTML静态化
其实⼤家都知道,效率最⾼、消耗最⼩的就是纯静态化的html页⾯,所以我们尽可能使我们的⽹站上的页⾯采⽤静态页⾯来实现,这个最简单的⽅法其实也是最有效的⽅法。但是对于⼤量内容并且频繁更新
的⽹站,我们⽆法全部⼿动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚⾄他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录⼊⾃动⽣成静态页⾯,还能具备频道管理、权限管理、⾃动抓取等功能,对于⼀个⼤型⽹站来说,拥有⼀套⾼效、可管理的CMS是必不可少的。
除了门户和信息发布类型的⽹站,对于交互性要求很⾼的社区类型⽹站来说,尽可能的静态化也是提⾼性能的必要⼿段,将社区内的帖⼦、⽂章进⾏实时的静态化,有更新的时候再重新静态化也是⼤量使⽤的策略,像Mop的⼤杂烩就是使⽤了这样的策略,⽹易社区等也是如此。
同时,html静态化也是某些缓存策略使⽤的⼿段,对于系统中频繁使⽤数据库查询但是内容更新很⼩的应⽤,可以考虑使⽤html静态化来实现,⽐如论坛中论坛的公⽤设置信息,这些信息⽬前的主流论坛都可以进⾏后台管理并且存储再数据库中,这些信息其实⼤量被前台程序调⽤,但是更新频率很⼩,可以考虑将这部分内容进⾏后台更新的时候进⾏静态化,这样避免了⼤量的数据库访问请求。
2、图⽚服务器分离
⼤家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图⽚是最消耗资源的,于是我们有必要将图⽚与页⾯进⾏分离,这是基本上⼤型⽹站都会采⽤的策略,他们都有独⽴的图⽚服务器,甚⾄很多台图⽚服务器。这样的架构可以降低提供页⾯访问请求的服务器系统压⼒,并且可以保证系
统不会因为图⽚问题⽽崩溃,在应⽤服务器和图⽚服务器上,可以进⾏不同的配置优化,⽐如apache在配置ContentType的时候可以尽量少⽀持,尽可能少的LoadModule,保证更⾼的系统消耗和执⾏效率。
3、数据库集和库表散列
⼤型⽹站都有复杂的应⽤,这些应⽤必须使⽤数据库,那么在⾯对⼤量访问的时候,数据库的瓶颈很快就能显现出来,这时⼀台数据库将很快⽆法满⾜应⽤,于是我们需要使⽤数据库集或者库表散列。
在数据库集⽅⾯,很多数据库都有⾃⼰的解决⽅案,Oracle、Sybase等都有很好的⽅案,常⽤的MySQL提供的Master/Slave也是类似的⽅案,您使⽤了什么样的DB,就参考相应的解决⽅案来实施即可。
上⾯提到的数据库集由于在架构、成本、扩张性⽅⾯都会受到所采⽤DB类型的限制,于是我们需要从应⽤程序的⾓度来考虑改善系统架构,库表散列是常⽤并且最有效的解决⽅案。我们在应⽤程序中安装业务和应⽤或者功能模块将数据库进⾏分离,不同的模块对应不同的数据库或者表,再按照⼀定的策略对某个页⾯或者功能进⾏更⼩的数据库散列,⽐如⽤户表,按照⽤户ID进⾏表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采⽤了这样的架构,将论坛的⽤户
、设置、帖⼦等信息进⾏数据库分离,然后对帖⼦、⽤户按照板块和ID进⾏散列数据库和表,最终可以在配置⽂件中进⾏简单的配置便能让系统随时增加⼀台低成本的数据库进来补充系统性能。
4、缓存
缓存⼀词搞技术的都接触过,很多地⽅⽤到缓存。⽹站架构和⽹站开发中的缓存也是⾮常重要。这⾥先讲述最基本的两种缓存。⾼级和分布式的缓存在后⾯讲述。
架构⽅⾯的缓存,对Apache⽐较熟悉的⼈都能知道Apache提供了⾃⼰的缓存模块,也可以使⽤外加的Squid模块进⾏缓存,这两种⽅式均可以有效的提⾼Apache的访问响应能⼒。
⽹站程序开发⽅⾯的缓存,Linux上提供的Memory Cache是常⽤的缓存接⼝,可以在web开发中使⽤,⽐如⽤Java开发的时候就可以调⽤MemoryCache对⼀些数据进⾏缓存和通讯共享,⼀些⼤型社区使⽤了这样的架构。另外,在使⽤web语⾔开发的时候,各种语⾔基本都有⾃⼰的缓存模块和⽅法,PHP有Pear的Cache模块,Java就更多了,不是很熟悉,相信也肯定有。
5、镜像
镜像是⼤型⽹站常采⽤的提⾼性能和数据安全性的⽅式,镜像的技术可以解决不同⽹络接⼊商和地域带来的⽤户访问速度差异,⽐如ChinaNet和EduNet之间的差异就促使了很多⽹站在教育⽹内搭建镜像
站点,数据进⾏定时更新或者实时更新。在镜像的细节技术⽅⾯,这⾥不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,⽐如Linux上的rsync等⼯具。
6、负载均衡
负载均衡将是⼤型⽹站解决⾼负荷访问和⼤量并发请求采⽤的终极解决办法。
负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个⼈接触过⼀些解决⽅法,其中有两个架构可以给⼤家做参考。
1)硬件四层交换
第四层交换使⽤第三层和第四层信息包的报头信息,根据应⽤区间识别业务流,将整个区间段的业务流分配到合适的应⽤服务器进⾏处理。第四层交换功能就象是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端⼝地址来决定,在第四层交换中的应⽤区间则由源端和终端IP地址、TCP和UDP端⼝共同决定。
在硬件四层交换产品领域,有⼀些知名的产品可以选择,⽐如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供⾮常优秀的性能和很灵活的管理能⼒。Yahoo中国当初接近2000台服务器使⽤了
三四台Alteon就搞定了。
2)软件四层交换
⼤家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运⽽⽣,这样的解决⽅案实现的原理⼀致,不过性能稍差。但是满⾜⼀定量的压⼒还是游刃有余的,有⼈说软件实现⽅式其实更灵活,处理能⼒完全看你配置的熟悉能⼒。
软件四层交换我们可以使⽤Linux上常⽤的LVS来解决,LVS就是Linux Virtual Server,他提供了基于⼼跳线heartbeat的实时灾难应对解决⽅案,提⾼系统的鲁棒性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满⾜多种应⽤需求,这对于分布式的系统来说必不可少。
⼀个典型的使⽤负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集,这种思路在很多⼤型⽹站包括搜索引擎上被采⽤,这样的架构低成本、⾼性能还有很强的扩张性,随时往架构⾥⾯增减节点都⾮常容易。这样的架构我准备空了专门详细整理⼀下和⼤家探讨。
java处理⾼并发⾼负载类⽹站中数据库的设计⽅法(java教程,java处理⼤量数据,java⾼负载数据)
⼀:⾼并发⾼负载类⽹站关注点之数据库
没错,⾸先是数据库,这是⼤多数应⽤所⾯临的⾸个SPOF。尤其是Web2.0的应⽤,数据库的响应是⾸先要解决的。
⼀般来说MySQL是最常⽤的,可能最初是⼀个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降。常⽤的优化措施是M-S(主-从)⽅式进⾏同步复制,将查
询和操作和分别在不同的服务器上进⾏操作。我推荐的是M-M-Slaves⽅式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,但是同时只有1个是Active,我们可以
在⼀定时候切换。之所以⽤2个M,是保证M不会⼜成为系统的SPOF。
Slaves可以进⼀步负载均衡,可以结合LVS,从⽽将select操作适当的平衡到不同的slaves上。
以上架构可以抗衡到⼀定量的负载,但是随着⽤户进⼀步增加,你的⽤户表数据超过1千万,这时那个M变成了SPOF。你不能任意扩充Slaves,否则复制同步的开销将直线上
升,怎么办?我的⽅法是表分区,从业务层⾯上进⾏分区。最简单的,以⽤户数据为例。根据⼀定的切分⽅式,⽐如id,切分到不同的数据库集去。
全局数据库⽤于meta数据的查询。缺点是每次查询,会增加⼀次,⽐如你要查⼀个⽤户nightsailer,
你⾸先要到全局数据库到nightsailer对应的cluster id,然后再到指定的cluster到nightsailer的实际数据。
每个cluster可以⽤m-m⽅式,或者m-m-slaves⽅式。这是⼀个可以扩展的结构,随着负载的增加,你可以简单的增加新的mysql cluster进去。
需要注意的是:
1、禁⽤全部auto_increment的字段
2、id需要采⽤通⽤的算法集中分配
3、要具有⽐较好的⽅法来监控mysql主机的负载和服务的运⾏状态。如果你有30台以上的mysql数据库在跑就明⽩我的意思了。
4、不要使⽤持久性链接(不要⽤pconnect),相反,使⽤sqlrelay这种第三⽅的数据库链接池,或者⼲脆⾃⼰做,因为php4中mysql的链接池经常出问题。
⼆:⾼并发⾼负载⽹站的系统架构之HTML静态化
⽹站HTML静态化解决⽅案
当⼀个Servlet资源请求到达WEB服务器之后我们会填充指定的JSP页⾯来响应请求:
HTTP请求---Web服务器---Servlet--业务逻辑处理--访问数据--填充JSP--响应请求
HTML静态化之后:
HTTP请求---Web服务器---Servlet--HTML--响应请求
静态访求如下
Servlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Parameter("chapterId") != null){
String chapterFileName = "bookChapterRead_"+Parameter("chapterId")+".html";
String chapterFilePath = getServletContext().getRealPath("/") + chapterFileName;
File chapterFile = new File(chapterFilePath);
ists()){response.sendRedirect(chapterFileName);return;}//如果有这个⽂件就告诉浏览器转向
INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl();
NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.Parameter("chapterId")));//章节信息
int lastPageId = novelChapterBiz.NovelId().getId(), Id());
int nextPageId = novelChapterBiz.NovelId().getId(), Id());
request.setAttribute("novelChapter", novelChapter);
request.setAttribute("lastPageId", lastPageId);
request.setAttribute("nextPageId", nextPageId);
new CreateStaticHTMLPage().createStaticHTMLPage(request, response, getServletContext(),
chapterFileName, chapterFilePath, "/bookRead.jsp");
}
}
⽣成HTML静态页⾯的类:
package com.jb.y2t034.thefifth.web.servlet;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
* 创建HTML静态页⾯
* 功能:创建HTML静态页⾯
* 时间:2009年1011⽇
* 地点:home
* @author mavk
*
*/
public class CreateStaticHTMLPage {
/**
* ⽣成静态HTML页⾯的⽅法
* @param request 请求对象
* @param response 响应对象
* @param servletContext Servlet上下⽂
* @param fileName ⽂件名称
* @param fileFullPath ⽂件完整路径
* @param jspPath 需要⽣成静态⽂件的JSP路径(相对即可)
* @throws IOException
* @throws ServletException
*/
public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOException{ response.setContentType("text/html;charset=gb2312");//设置HTML结果流编码(即HTML⽂件编码)
RequestDispatcher rd = RequestDispatcher(jspPath);//得到JSP资源
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//⽤于从ServletOutputStream中接收资源
final ServletOutputStream servletOuputStream = new ServletOutputStream(){//⽤于从HttpServletResponse中接收资源
public void write(byte[] b, int off,int len){
byteArrayOutputStream.write(b, off, len);
}
public void write(int b){
byteArrayOutputStream.write(b);
}
};
final PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream));//把转换字节流转换成字符流
HttpServletResponse httpServletResponse = new HttpServletResponseWrapper(response){//⽤于从r
esponse获取结果流资源(重写了两个⽅法)
public ServletOutputStream getOutputStream(){
return servletOuputStream;
}
public PrintWriter getWriter(){
return printWriter;
}
};
rd.include(request, httpServletResponse);//发送结果流
printWriter.flush();//刷新缓冲区,把缓冲区的数据输出
FileOutputStream fileOutputStream = new FileOutputStream(fileFullPath);
byteArrayOutputStream.writeTo(fileOutputStream);//把byteArrayOuputStream中的资源全部写⼊到fileOuputStream中
fileOutputStream.close();//关闭输出流,并释放相关资源
response.sendRedirect(fileName);//发送指定⽂件流到客户端
}
}
三:⾼并发⾼负载类⽹站关注点之缓存、负载均衡、存储
缓存是另⼀个⼤问题,我⼀般⽤memcached来做缓存集,⼀般来说部署10台左右就差不多(10g内存池)。需要注意⼀点,千万不能⽤使⽤
swap,最好关闭linux的swap。
负载均衡/加速
可能上⾯说缓存的时候,有⼈第⼀想的是页⾯静态化,所谓的静态html,我认为这是常识,不属于要
点了。页⾯的静态化随之带来的是静态服务的
负载均衡和加速。我认为Lighttped+Squid是最好的⽅式了。
LVS <------->lighttped====>squid(s) ====lighttpd
上⾯是我经常⽤的。注意,我没有⽤apache,除⾮特定的需求,否则我不部署apache,因为我⼀般⽤php-fastcgi配合lighttpd,
性能⽐apache+mod_php要强很多。
squid的使⽤可以解决⽂件的同步等等问题,但是需要注意,你要很好的监控缓存的命中率,尽可能的提⾼的90%以上。
squid和lighttped也有很多的话题要讨论,这⾥不赘述。
存储
存储也是⼀个⼤问题,⼀种是⼩⽂件的存储,⽐如图⽚这类。另⼀种是⼤⽂件的存储,⽐如搜索引擎的索引,⼀般单⽂件都超过2g以上。
⼩⽂件的存储最简单的⽅法是结合lighttpd来进⾏分布。或者⼲脆使⽤Redhat的GFS,优点是应⽤透明,缺点是费⽤较⾼。我是指
你购买盘阵的问题。我的项⽬中,存储量是2-10Tb,我采⽤了分布式存储。这⾥要解决⽂件的复制和冗余。
这样每个⽂件有不同的冗余,这⽅⾯可以参考google的gfs的论⽂。
⼤⽂件的存储,可以参考nutch的⽅案,现在已经独⽴为hadoop⼦项⽬。(你可以google it)
其他:
此外,passport等也是考虑的,不过都属于⽐较简单的了。
四:⾼并发⾼负载⽹站的系统架构之图⽚服务器分离
⼤家知道,对于Web 服务器来说,不管是Apache、IIS还是其他容器,图⽚是最消耗资源的,于是我们有必要将图⽚与页⾯进⾏分离,这是基本上⼤型⽹站都会采⽤的策略,他们都有独⽴的图⽚服务器,甚⾄很多台图⽚服务器。这样的架构可以降低提供页⾯访问请求的服务器系统压⼒,并且可以保证系统不会因为图⽚问题⽽崩溃,在应⽤服务器和图⽚服务器上,可以进⾏不同的配置优化,⽐如apa
che在配置ContentType的时候可以尽量少⽀持,尽可能少的LoadModule,保证更⾼的系统消耗和执⾏效率。
利⽤Apache实现图⽚服务器的分离
缘由:
起步阶段的应⽤,都可能部署在⼀台服务器上(费⽤上的原因)
第⼀个优先分离的,肯定是数据库和应⽤服务器。
第⼆个分离的,会是什么呢?各有各的考虑,我所在的项⽬组重点考虑的节约带宽,服务器性能再好,带宽再⾼,并发来了,也容易撑不住。因此,我这篇⽂章的重点在这⾥。这⾥重点是介绍实践,不⼀定符合所有情况,供看者参考吧,
环境介绍:
WEB应⽤服务器:4CPU双核2G, 内存4G
部署:Win2003/Apache Http Server 2.1/Tomcat6
数据库服务器:4CPU双核2G, 内存4G
部署:Win2003/MSSQL2000
java安装完整教程步骤:
步骤⼀:增加2台配置为:2CPU双核2G,内存2G普通服务器,做资源服务器
部署:Tomcat6,跑了⼀个图⽚上传的简单应⽤,(记得指定l的<distributable/>),并指定域名为res1.***,res2.***,采⽤ajp协议
步骤⼆:修改f配置
原来应⽤的⽂件上传功能⽹址为:
1、/fileupload.html
2、/otherupload.html
在f中增加如下配置
现在,你可以⾼枕⽆忧了,带宽不够时,增加个⼏⼗台图⽚服务器,只需要稍微修改⼀下apache的配置⽂件,即可。
五:⾼并发⾼负载⽹站的系统架构之数据库集和库表散列
⼤型⽹站都有复杂的应⽤,这些应⽤必须使⽤数据库,那么在⾯对⼤量访问的时候,数据库的瓶颈很快就能显现出来,这时⼀台数据库将很快⽆法满⾜应⽤,于是我们需要使⽤数据库集或者库表散列。
在数据库集⽅⾯,很多数据库都有⾃⼰的解决⽅案,Oracle、Sybase等都有很好的⽅案,常⽤的MySQL提供的Master/Slave也是类似的⽅案,您使⽤了什么样的DB,就参考相应的解决⽅案来实施即可。
上⾯提到的数据库集由于在架构、成本、扩张性⽅⾯都会受到所采⽤DB类型的限制,于是我们需要从应⽤程序的⾓度来考虑改善系统架构,库表散列是常⽤并且最有效的解决⽅案。我们在应⽤程序中安装业务和应⽤或者功能模块将数据库进⾏分离,不同的模块对应不同的数据库或者表,再按照⼀定的策略对某个页⾯或者功能进⾏更⼩的数据库散列,⽐如⽤户表,按照⽤户ID进⾏表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采⽤了这样的架构,将论坛的⽤户、设置、帖⼦等信息进⾏数据库分离,然后对帖⼦、⽤户按照板块和ID进⾏散列数据库和表,最终
可以在配置⽂件中进⾏简单的配置便能让系统随时增加⼀台低成本的数据库进来补充系统性能。
集软件的分类:
⼀般来讲,集软件根据侧重的⽅向和试图解决的问题,分为三⼤类:⾼性能集(High performance cluster,HPC)、负载均衡集(Load balance cluster, LBC),⾼可⽤性集(High availability cluster,HAC)。
⾼性能集(High performance cluster,HPC),它是利⽤⼀个集中的多台机器共同完成同⼀件任务,使得完成任务的速度和可靠性都远远⾼于单机运⾏的效果。弥补了单机性能上的不⾜。该集在天⽓预报、环境监控等数据量⼤,计算复杂的环境中应⽤⽐较多;
负载均衡集(Load balance cluster, LBC),它是利⽤⼀个集中的多台单机,完成许多并⾏的⼩的⼯作。⼀般情况下,如果⼀个应⽤使⽤的⼈多了,那么⽤户请求的响应时间就会增⼤,机器的性能也会受到影响,如果使⽤负载均衡集,那么集中任意⼀台机器都能响应⽤户的请求,这样集就会在⽤户发出服务请求之后,选择当时负载最⼩,能够提供最好的服务的这台机器来接受请求并相应,这样就可⽤⽤集来增加系统的可⽤性和稳定性。这类集在⽹站中使⽤较多;
⾼可⽤性集(High availability cluster,HAC),它是利⽤集中系统的冗余,当系统中某台机器发
⽣损坏的时候,其他后备的机器可以迅速的接替它来启动服务,等待故障机的维修和返回。最⼤限度的保证集中服务的可⽤性。这类系统⼀般在银⾏,电信服务这类对系统可靠性有⾼的要求的领域有着⼴泛的应⽤。
2 数据库集的现状
数据库集是将计算机集技术引⼊到数据库中来实现的,尽管各⼚商宣称⾃⼰的架构如何的完美,但是始终不能改变Oracle当先,⼤家追逐的事实,在集的解决⽅案上Oracle RAC还是领先于包括微软在内的其它数据库⼚商,它能满⾜客户⾼可⽤性、⾼性能、数据库负载均衡和⽅便扩展的需求。
Oracle’s Real Application Cluster (RAC)
Microsoft SQL Cluster Server (MSCS)
IBM’s DB2 UDB High Availability Cluster(UDB)
Sybase ASE High Availability Cluster (ASE)
MySQL High Availability Cluster (MySQL CS)
基于IO的第三⽅HA(⾼可⽤性)集
当前主要的数据库集技术有以上六⼤类,有数据库⼚商⾃⼰开发的;也有第三⽅的集公司开发的;还有数据库⼚商与第三⽅集公司合作开发的,各类集实现的功能及架构也不尽相同。
RAC(Real Application Cluster,真正应⽤集)是Oracle9i数据库中采⽤的⼀项新技术,也是Oracle数据库⽀持⽹格计算环境的核⼼技术。它的出现解决了传统数据库应⽤中⾯临的⼀个重要问题:⾼性能、⾼可伸缩性与低价格之间的⽭盾。在很长⼀段时间⾥,甲⾻⽂都以其实时应⽤集技术(Real Application Cluster,RAC)统治着集数据库市场六:⾼并发⾼负载⽹站的系统架构之缓存
缓存⼀词搞技术的都接触过,很多地⽅⽤到缓存。⽹站架构和⽹站开发中的缓存也是⾮常重要。这⾥先讲述最基本的两种缓存。⾼级和分布式的缓存在后⾯讲述。
架构⽅⾯的缓存,对Apache⽐较熟悉的⼈都能知道Apache提供了⾃⼰的缓存模块,也可以使⽤外加的Squid模块进⾏缓存,这两种⽅式均可以有效的提⾼Apache的访问响应能⼒。
⽹站程序开发⽅⾯的缓存,Linux上提供的Memory Cache是常⽤的缓存接⼝,可以在web开发中使⽤,⽐如⽤Java开发的时候就可以调⽤MemoryCache对⼀些数据进⾏缓存和通讯共享,⼀些⼤型社区使⽤了这样的架构。另外,在使⽤web语⾔开发的时候,各种语⾔基本都有⾃⼰的缓存模块和⽅法,PHP有Pear的Cache模块,Java就更多了,不是很熟悉,相信也肯定有。
Java开源缓存框架
JBossCache/TreeCache JBossCache 是⼀个复制的事务处理缓存,它允许你缓存企业级应⽤数据来更好的改善性能。缓存数据被⾃动复制,让你轻松进⾏Jboss服务器之间的集⼯作。JBossCache能够通过Jboss应⽤服务或其他J2EE容器来运⾏⼀个Mbean服务,当然,它也能独⽴运⾏。 JBossCache包括两个模块:TreeCache和TreeCacheAOP。 TreeCache --是⼀个树形结构复制的事务处理缓存。 TreeCacheAOP --是⼀个“⾯向对象”缓存,它使⽤AOP来动态管理POJO.
OSCache OSCache标记库由OpenSymphony设计,它是⼀种开创性的JSP定制标记应⽤,提供了在现有JSP页⾯之内实现快速内存缓冲的功能。OSCache是个⼀个⼴泛采⽤的⾼性能的J2EE缓存框架,OSCache能⽤于任何Java应⽤程序的普通的缓存解决⽅案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页⾯或HTTP请求,任何java对象都可以缓存。拥有全⾯的API--OSCache API给你全⾯的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写⼊硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚⾄能让应⽤重启。⽀持集--集缓存数据能被单个的进⾏参数配置,不需要修改代码。缓存记录的过期--你可以有最⼤限度的控制缓存对象的过期,包括可插⼊式的刷新策略(如果默认性能不需要时)。
JCACHE JCACHE是⼀种即将公布的标准规范(JSR 107),说明了⼀种对Java对象临时在内存中进⾏缓存的⽅法,包括对象的创建、共享访问、假脱机(spooling)、失效、各JVM的⼀致性等。它可被⽤于缓存JSP内最经常读取的数据,如产品⽬录和价格列表。利⽤JCACHE,多数查询的反应时间
会因为有缓存的数据⽽加快(内部测试表明反应时间⼤约快15倍)。
Ehcache Ehcache出⾃Hibernate,在Hibernate中使⽤它作为数据缓存的解决⽅案。
Java Caching System JCS是Jakarta的项⽬Turbine的⼦项⽬。它是⼀个复合式的缓冲⼯具。可以将对象缓冲到内存、硬盘。具有缓冲对象时间过期设定。还可以通过JCS构建具有缓冲的分布式构架,以实现⾼性能的应⽤。对于⼀些需要频繁访问⽽每访问⼀次都⾮常消耗资源的对象,可以临时存放在缓冲区中,这样可以提⾼服务的性能。⽽JCS正是⼀个很好的缓冲⼯具。缓冲⼯具对于读操作远远多于写操作的应⽤性能提⾼⾮常显著。
SwarmCache SwarmCache是⼀个简单⽽功能强⼤的分布式缓存机制。它使⽤IP组播来有效地在缓存的实例之间进⾏通信。它是快速提⾼集式Web应⽤程序的性能的理想选择。
ShiftOne ShiftOne Object Cache这个Java库提供了基本的对象缓存能⼒。实现的策略有先进先出(FIFO),最近使⽤(LRU),最不常使⽤(LFU)。所有的策略可以最⼤化元素的⼤⼩,最⼤化其⽣存时间。
WhirlyCache Whirlycache是⼀个快速的、可配置的、存在于内存中的对象的缓存。它能够通过缓存对象来加快⽹站或应⽤程序的速度,否则就必须通过查询数据库或其他代价较⾼的处理程序来建⽴。
Jofti Jofti可对在缓存层中(⽀持EHCache,JBossCache和OSCache)的对象或在⽀持Map接⼝的存储结构中的对象进⾏索引与搜索。这个框架还为对象在索引中的增删改提供透明的功能同样也为搜索提供易于使⽤的查询功能。
cache4j cache4j是⼀个有简单API与实现快速的Java对象缓存。它的特性包括:在内存中进⾏缓存,设计⽤于多线程环境,两种实现:同步与阻塞,多种缓存清除策略:LFU, LRU, FIFO,可使⽤强引⽤(strong reference)与软引⽤(soft reference)存储对象。
Open Terracotta ⼀个JVM级的开源集框架,提供:HTTP Session复制,分布式缓存,POJO集,跨越集的JVM来实现分布式应⽤程序协调(采⽤代码注⼊的⽅式,所以你不需要修改任何)。
sccache SHOP.COM使⽤的对象缓存系统。sccache是⼀个in-process cache和⼆级、共享缓存。它将缓存对象存储到磁盘上。⽀持关联Key,任意⼤⼩的Key和任意⼤⼩的数据。能够⾃动进⾏垃圾收集。
Shoal Shoal是⼀个基于Java可扩展的动态集框架,能够为构建容错、可靠和可⽤的Java应⽤程序提供了基础架构⽀持。这个框架还可以集成到不希望绑定到特定通信协议,但需要集和分布式系统⽀持的任何Java产品中。Shoal是GlassFish和JonAS应⽤服务器的集引擎。
Simple-Spring-Memcached Simple-Spring-Memcached,它封装了对MemCached的调⽤,使MemCached的客户端开发变得超乎寻常的简单。
转⾃:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论