上一篇memcached基本配置与使用http://blog.csdn.net/sup_heaven/article/details/32337711介绍了memcached的一些基本概念和一个范例。
这一篇将以介绍一个memcached在项目中的应用。假设我们有一个web应用,里面有商品信息,文章信息,评论信息,其他信息,我们希望对其做缓存,那么我们在ServiceImpl层就不在调用DAOmpl层,而是调用CacheImpl层,在CacheImpl层中判断要取出的商品信息是否已经在缓存中,如果在了,那么直接从缓存中去,如果没有这个时候还是从数据库中取,同时将它放到缓存中,以便下次使用。
第一步、新建一个常量类,用于上面的四种信息的在数组中的索引。
-
publicclassMemcachedConstant{
-
publicstaticfinalintMEMCACHED_GOODSDETAIL=0;
-
publicstaticfinalintMEMCACHED_ARTICLEDETAIL=1;
-
publicstaticfinalintMEMCACHED_COMMENTDETAIL=2;
-
publicstaticfinalintMEMCACHED_OTHERDETAIL=3;
-
}
第二步、由于有大量的商品信息,我们在放入缓存时必须给定一个key,那么我们最好规范的命名不同类别的key,如商品的key就是商品的前缀加上商品的编号。
-
publicclassMemcachedKeyUtil{
-
privatestaticfinalStringGOODS_KEY_PREFIX="goods_";
-
-
publicstaticStringgetGoodsKey(longgoodsId){
-
returnGOODS_KEY_PREFIX+goodsId;
-
}
-
}
第三步、我们建一个和上一篇文章中一样的工具类,用于新建pool、client,操作缓存等。这里再强调一下,一个pool关联多个server(就是会根据权重将缓存放在这些servers上),一个client会通过poolName关联具体的pool。
-
publicclassMemcachedUtil{
-
privateintMEMCACHED_SERVER_NUM=4;
-
privateSockIOPool[]pools=newSockIOPool[MEMCACHED_SERVER_NUM];
-
privateMemCachedClient[]mcs=newMemCachedClient[MEMCACHED_SERVER_NUM];
-
privatefinalString[]poolNames=newString[]{"GOODSDETAIL_POOL","","",""};
-
privatestaticMemcachedUtilinstance;
-
privateMemcachedUtil(){
-
this.init();
-
}
-
-
publicstaticMemcachedUtilgetInstance(){
-
if(MemcachedUtil.instance==null){
-
synchronized(MemcachedUtil.class){
-
if(MemcachedUtil.instance==null){
-
MemcachedUtil.instance=newMemcachedUtil();
-
}
-
}
-
}
-
returnMemcachedUtil.instance;
-
}
-
-
publicObjectget(intindex,Stringkey){
-
returnthis.mcs[index].get(key);
-
}
-
-
publicbooleanset(intindex,Stringkey,Objectvalue){
-
returnthis.mcs[index].set(key,value);
-
}
-
-
publicbooleandelete(Stringkey){
-
returnthis.mcs[index].delete(key);
-
}
-
publicMemCachedClientgetMemCachedClient(intindex){
-
returnthis.mcs[index];
-
}
-
-
publicvoidinit(){
-
for(inti=0;i<MEMCACHED_SERVER_NUM;++i){
-
this.pools[i]=SockIOPool.getInstance(poolNames[i]);
-
this.pools[i].setServers(servers);
-
this.pools[i].setWeights(weights);
-
this.pools[i].setInitConn(initConn);
-
this.pools[i].setMinConn(minConn);
-
this.pools[i].setMaxConn(maxConn);
-
this.pools[i].setMaxIdle(maxIdle);
-
this.pools[i].setMaxBusyTime(maxBusyTime);
-
this.pools[i].setMaintSleep(maintSleep);
-
this.pools[i].setNagle(ifNagle);
-
this.pools[i].setSocketTO(socketTO);
-
this.pools[i].setSocketConnectTO(socketConnectTO);
-
this.pools[i].setFailover(ifFailOver);
-
this.pools[i].setFailback(ifFailback);
-
this.pools[i].setAliveCheck(ifAliveCheck);
-
this.pools[i].initialize();
-
this.mcs[i]=newMemCachedClient(poolNames[i]);
-
}
-
}
-
}
第四步、新建一个基类以供所用继承它的CacheImpl直接调用MemcachedUtil里的方法,如果不写该类那么在CacheImpl中会有很多重复的操作MemcachedUtil的代码。
-
publicclassMemcachedSupport{
-
publicbooleansetDetailData(Stringkey,Objectvalue){
-
returnMemcachedUtil.getInstance().set(MemcachedConstant.MEMCACHED_DETAIL,key,value);
-
}
-
-
publicObjectgetDetailData(Stringkey){
-
returnMemcachedUtil.getInstance().get(MemcachedConstant.MEMCACHED_DETAIL,key);
-
}
-
-
publicbooleandeleteDetailData(Stringkey){
-
returnMemcachedUtil.getInstance().delete(MemcachedConstant.MEMCACHED_DETAIL);
-
}
-
}
第五步、新建一个GoodsCacheImpl,该类的作用就是一开始所说的,娶不到缓存,就调用DAO查询并放入缓存,如果缓存中有就直接从缓存中拿。
-
publicclassGoodsCacheImplextendsMemcachedSupport{
-
@Resource(name="goodsDaoImpl")
-
privateGoodsDaogoodsDao;
-
-
publicGoodsselectGoodsById(longgoodsId){
-
Goodsgoods=null;
-
StringgoodsKey=MemcachedKeyUtil.getGoodsKey(goodsId);
-
goods=(Goods)getDetailData(goodsKey);
-
if(goods==null){
-
goods=goodsDao.selectGoodsById(goodsId,false);
-
if(goods!=null){
-
setDetailData(goodsKey,goods);
-
}
-
}
-
returngoods;
-
}
-
}
这样就在你的应用中使用了memcached,不过上面的只是部分代码,跑不起来的哦。
分享到:
相关推荐
此外,书中的案例研究将展示如何在真实环境中应用这些技术,为读者提供宝贵的实践经验。 总之,《Apache, MySQL, memcached和Perl开发Web应用程序》是一本全面而实用的教程,对于希望提升Web开发技能,尤其是使用...
这些实例可以帮助读者更好地理解Memcached在真实世界中的作用,以及如何根据自己的需求来设计和优化缓存策略。 通过阅读《Memcached权威指南》,读者不仅能掌握Memcached的基本操作,还能深入了解其内在机制和高级...
Rosehill 是一个专为 Folsom Memcached 客户端设计的测试平台,它为开发者提供了在真实环境中对客户端进行性能和功能验证的环境。这个项目的名字来源于美国加利福尼亚州的一个小镇——罗斯希尔,它地理位置上接近...
本实战应用资料基于真实的工业界案例,由龙果学院精心制作,旨在帮助IT专业人士深入理解并掌握企业级秒杀系统的构建与优化。 一、秒杀系统设计原理 秒杀系统的核心在于高并发处理能力和资源的有效分配。设计时需...
3. **Spring框架**:Spring是Java企业级应用广泛使用的轻量级框架,可能在项目中负责依赖注入(DI)、面向切面编程(AOP)以及事务管理等功能。 4. **MyBatis**:MyBatis是一个优秀的持久层框架,它简化了数据库...
在这个项目中,前端通常由JavaScript库(如React、Vue或Angular)处理,负责用户界面和交互,而后端Django应用专注于业务逻辑和API接口。这使得开发者可以更专注于各自的领域,提高开发效率和代码质量。 3. **模型...
4. **API设计**:RESTful API设计原则可能被应用在后端与前端的通信中,提供JSON格式的数据交换。 5. **安全机制**:包括用户认证(OAuth2、JWT)和授权机制,确保数据的安全传输。 6. **支付集成**:可能集成第三...
- 项目中应用MySQL实现数据存储和管理,如开发电子商城时的商品信息管理、订单处理等。 5. Linux操作系统基础 - Linux是常见的服务器操作系统之一,PHP/MySQL等服务常运行于Linux之上。 - 学习Linux的基本命令和...
该压缩包文件“java源码 仿360buy京东商城源码 京东JavaWeb项目源代码.zip”是一个用于...同时,这也是一个很好的案例,可以用来学习和应用软件工程中的各种原则和最佳实践,如代码规范、测试驱动开发、持续集成等。
【在线拍卖项目】是北大青鸟ACCP6.0课程中的一个重要实践环节,旨在通过模拟真实的在线拍卖场景,让学生深入理解和掌握IT技术在电子商务领域的应用。这个项目涉及到多个关键知识点,包括前端用户界面设计、后端...
确保列出的技能是你真正掌握并能在实际工作中运用的。 4. **项目经验**:详述你参与过的项目,包括项目名称、时间、角色、主要职责以及取得的成果。突出你在项目中的贡献,比如优化系统性能、解决复杂技术问题、...
该资源是一个基于PHP的下载地址转换工具,专用于将迅雷、旋风、快车等下载工具生成的专用链接转换为可以直接访问的...通过深入研究和理解这个源码,你可以掌握更多关于PHP Web开发的知识,并可能将其应用到实际项目中。
- **VS/DR (Virtual Server via Direct Routing)**:LVS和真实服务器位于同一物理网络中,LVS将请求的目标MAC地址修改为真实服务器的MAC地址,直接将请求发送给真实服务器。真实服务器响应后,直接返回给客户端,...
“分布式缓存-第四章:综合案例篇:理论与技能在实际工作中落地.pdf”将理论知识与实际工作场景相结合,分析了如何在真实项目中应用分布式缓存。这部分可能涵盖电商、社交、推荐系统等领域的应用场景,比如商品...
在Java Web开发中,该项目可能采用了MVC(Model-View-Controller)设计模式,这是一种常见的Web应用架构,将业务逻辑、数据和用户界面分离,使得代码更易于维护和扩展。模型层(Model)负责处理业务逻辑和数据操作,...
`Laravel开发-dsettings`项目旨在提供一个解决方案,它允许开发者将应用程序的设置存储在数据库中,并通过缓存层来优化性能,避免频繁地访问数据库。 1. **数据库存储设置** - **结构设计**:通常,我们会创建一个...
商城实战则意味着课程不仅涉及理论知识,更注重实践操作,帮助学员掌握在真实环境中创建电商网站所需的技能。 【压缩包子文件的文件名称列表】包含"ThinkPHP"和"shop"两个部分,这表明压缩包内可能包括了ThinkPHP...
11. **SEO优化**:搜索引擎友好(SEO)的代码编写,比如合理使用`<meta>`标签,优化URL结构,有助于提升网站在真实搜索引擎中的排名。 12. **安全防护**:防止SQL注入和XSS攻击是重要的安全性考虑。使用预编译语句...
8. **案例研究**:书中可能会包含实际项目案例,展示如何在真实场景中应用上述技术。 9. **最佳实践**:分享分布式系统设计的最佳实践,包括性能优化、安全性考量和监控策略。 10. **持续集成与部署**:介绍使用...
如果"真实住宅"项目需要提供API供其他应用或移动设备使用,PHP可以通过Laravel或Symfony等现代框架实现RESTful API设计。这些框架提供路由、认证和JSON响应等功能,使得API开发更加高效。 6. 安全性: 在处理用户...