memcached在项目中的应用
这一篇将以介绍一个memcached在项目中的应用。假设我们有一个web应用,里面有商品信息,文章信息,评论信息,其他信息,我们希望对其做缓存,那么我们在ServiceImpl层就不在调用DAOmpl层,而是调用CacheImpl层,在CacheImpl层中判断要取出的商品信息是否已经在缓存中,如果在了,那么直接从缓存中去,如果没有这个时候还是从数据库中取,同时将它放到缓存中,以便下次使用。
第一步、新建一个常量类,用于上面的四种信息的在数组中的索引。
public class MemcachedConstant { public static final int MEMCACHED_GOODSDETAIL = 0; public static final int MEMCACHED_ARTICLEDETAIL = 1; public static final int MEMCACHED_COMMENTDETAIL = 2; public static final int MEMCACHED_OTHERDETAIL = 3;
}
第二步、由于有大量的商品信息,我们在放入缓存时必须给定一个key,那么我们最好规范的命名不同类别的key,如商品的key就是商品的前缀加上商品的编号。
public class MemcachedKeyUtil { private static final String GOODS_KEY_PREFIX = "goods_"; public static String getGoodsKey(long goodsId) { return GOODS_KEY_PREFIX + goodsId; }
}
第三步、我们建一个和上一篇文章中一样的工具类,用于新建pool、client,操作缓存等。这里再强调一下,一个pool关联多个server(就是会根据权重将缓存放在这些servers上),一个client会通过poolName关联具体的pool。
public class MemcachedUtil { private int MEMCACHED_SERVER_NUM = 4; private SockIOPool[] pools = new SockIOPool[MEMCACHED_SERVER_NUM]; private MemCachedClient[] mcs = new MemCachedClient[MEMCACHED_SERVER_NUM]; private final String[] poolNames = new String[] { "GOODSDETAIL_POOL", "", "", "" }; private static MemcachedUtil instance; private MemcachedUtil() { this.init(); } // 单例 public static MemcachedUtil getInstance() { if (MemcachedUtil.instance == null) { synchronized (MemcachedUtil.class) { if (MemcachedUtil.instance == null) { MemcachedUtil.instance = new MemcachedUtil(); } } } return MemcachedUtil.instance; } public Object get(int index, String key) { return this.mcs[index].get(key); } public boolean set(int index, String key, Object value) { return this.mcs[index].set(key, value); } public boolean delete(String key) { return this.mcs[index].delete(key); } public MemCachedClient getMemCachedClient(int index) { return this.mcs[index]; } public void init() { for (int i = 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] = new MemCachedClient(poolNames[i]); } }
}
第四步、新建一个基类以供所用继承它的CacheImpl直接调用MemcachedUtil里的方法,如果不写该类那么在CacheImpl中会有很多重复的操作MemcachedUtil的代码。
public class MemcachedSupport { public boolean setDetailData(String key, Object value) { return MemcachedUtil.getInstance().set(MemcachedConstant.MEMCACHED_DETAIL, key, value); } public Object getDetailData(String key) { return MemcachedUtil.getInstance().get(MemcachedConstant.MEMCACHED_DETAIL, key); } public boolean deleteDetailData(String key) { return MemcachedUtil.getInstance().delete(MemcachedConstant.MEMCACHED_DETAIL); }
}
第五步、新建一个GoodsCacheImpl,该类的作用就是一开始所说的,娶不到缓存,就调用DAO查询并放入缓存,如果缓存中有就直接从缓存中拿。
public class GoodsCacheImpl extends MemcachedSupport{ @Resource(name = "goodsDaoImpl") private GoodsDao goodsDao; public Goods selectGoodsById(long goodsId) { Goods goods = null; String goodsKey = MemcachedKeyUtil.getGoodsKey(goodsId); goods = (Goods) getDetailData(goodsKey); if (goods == null) { goods = goodsDao.selectGoodsById(goodsId, false); if (goods != null) { setDetailData(goodsKey, goods); } } return goods; }
}
原文链接 : http://blog.csdn.net/sup_heaven/article/details/32728477/
转载于:https://www.cnblogs.com/dbqjava/p/5309920.html
memcached在项目中的应用相关推荐
- Redis学习笔记之二 :在Java项目中使用Redis
成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...
- redis java驱动_Redis学习笔记之二 :在Java项目中使用Redis
成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...
- 在项目中使用redis的原因
1:redis简介: redis是Nosql数据库中使用较为广泛的非关系内存数据库,redis内部是一个key-value存储系统.它支持存储的value类型相对更多,包括string(字符串),li ...
- 谈谈MVC项目中的缓存功能设计的相关问题
今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考 前言 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源 ...
- 电商项目中的经典问题
转载自:https://blog.csdn.net/A_BlackMoon/article/details/80094814 请描述一下这个系统? [回答技巧] 从3个方面来回答这个问题: |--系统 ...
- php codeigniter 语言,PHP项目中CodeIgniter使用的建议
PHP项目中CodeIgniter使用的建议 PHP是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用.下面为大家介绍一些PHP项目中Cod ...
- canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传
使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...
- android studio 自动提示jni代码,如何将JNI(C/C++本机代码)添加到现有的Android Studio项目中...
从现有项目中执行以下步骤: 1.修改build.gradle(模块应用程序)看起来像这样(很多变化!): apply plugin: 'com.android.model.application' m ...
- android使用webview上传文件,Android项目中如何在webview页面中上传文件
Android项目中如何在webview页面中上传文件 发布时间:2020-11-26 15:56:27 来源:亿速云 阅读:68 作者:Leah 本篇文章为大家展示了Android项目中如何在web ...
- java fragment_Java Web Fragment在项目中使用方法详解
Web Fragment 是什么 - 它是在 servlet 3.0开始支持的,可以把一个dy web项目拆分为多个项目,解耦合,使其在项目中开发效率提高,下面我演示简单的项目创建过程 用eclips ...
最新文章
- 段页式存储管理方式的定义
- UIRemoteNotificationType 参考
- AS3.0的int uint Number的使用原则
- android系统自动构建,[系统集成] Android 自动构建系统
- “管理”解读——浅谈国内IT服务管理产品标准建立的必要性(之一)
- 解密昇腾AI处理器--DaVinci架构(计算单元)
- Go学习笔记(只有链接)
- Spring Cloud 服务注册与发现 [ eureka ]
- 输入一个日期,计算这个日期与 2018-03-12差多少天;
- CCF201803-4 棋局评估(100分)【博弈+DFS】
- Futter基础第20篇: 实现轮播图 flutter_swiper
- 为什么密度泛函理论 (DFT) 会低估带隙?
- 重置计算机的本地策略,Win10怎样重置组策略/安全策略|Win10重置组策略/安全策略教程...
- 开机直接进入键盘布局_win8.1系统苹果电脑开机卡在选择键盘布局界面的解决方法...
- 微服务部署之蓝绿发布、滚动发布、灰度发布区别与特点!
- Updating Scoop 遇到问题
- python密码密文转换_浅论Python密文输入密码的方法
- 为什么我从PR里面导出来的视频,在电脑上播放是正常的,微信发给朋友后,形状就变了,扭曲了一样的
- VSCode安装和使用教程
- 关键遥信量性能缺失的分析报告
热门文章
- 又见回文数 NYOJ781
- codeup21280:LIS最长不下降子序列问题(可不连续-dp基础题)
- 网格搜索、随机搜索和贝叶斯调参总结与python代码实践
- 解决ubuntu 20.04 打不开设置的问题
- javamailsender注入失败_使用Spring3.x框架的java mail支持来发送邮件
- 用计算机弹假面骑士build,假面骑士build使用的武器汇总,你知道几个?
- 极客大学架构师训练营 JVM虚拟机原理 JVM垃圾回收原理 Java编程优化 秒杀 第九次作业
- 算法:回溯九 Plus在数字字符串中加入加号,求所有情况的和
- java 文件上传终止_java文件上传
- mos管结电容等效模型_【详解各元器件等效电路】电阻、电容、电感、二极管、MOS管!...