这一篇将以介绍一个memcached在项目中的应用。假设我们有一个web应用,里面有商品信息,文章信息,评论信息,其他信息,我们希望对其做缓存,那么我们在ServiceImpl层就不在调用DAOmpl层,而是调用CacheImpl层,在CacheImpl层中判断要取出的商品信息是否已经在缓存中,如果在了,那么直接从缓存中去,如果没有这个时候还是从数据库中取,同时将它放到缓存中,以便下次使用。

第一步、新建一个常量类,用于上面的四种信息的在数组中的索引。

[java] view plain copy  
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就是商品的前缀加上商品的编号。

[java] view plain copy  
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。

[java] view plain copy  
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的代码。

[java] view plain copy  
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查询并放入缓存,如果缓存中有就直接从缓存中拿。

[java] view plain copy  
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在项目中的应用相关推荐

  1. Redis学习笔记之二 :在Java项目中使用Redis

    成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...

  2. redis java驱动_Redis学习笔记之二 :在Java项目中使用Redis

    成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...

  3. 在项目中使用redis的原因

    1:redis简介: redis是Nosql数据库中使用较为广泛的非关系内存数据库,redis内部是一个key-value存储系统.它支持存储的value类型相对更多,包括string(字符串),li ...

  4. 谈谈MVC项目中的缓存功能设计的相关问题

    今天这一篇文章我来谈一谈在MVC 3项目中的缓存功能,以及针对缓存的一些设计上的考量,给大家参考参考 前言 为什么需要讨论缓存?缓存是一个中大型系统所必须考虑的问题.为了避免每次请求都去访问后台的资源 ...

  5. 电商项目中的经典问题

    转载自:https://blog.csdn.net/A_BlackMoon/article/details/80094814 请描述一下这个系统? [回答技巧] 从3个方面来回答这个问题: |--系统 ...

  6. php codeigniter 语言,PHP项目中CodeIgniter使用的建议

    PHP项目中CodeIgniter使用的建议 PHP是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用.下面为大家介绍一些PHP项目中Cod ...

  7. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...

  8. android studio 自动提示jni代码,如何将JNI(C/C++本机代码)添加到现有的Android Studio项目中...

    从现有项目中执行以下步骤: 1.修改build.gradle(模块应用程序)看起来像这样(很多变化!): apply plugin: 'com.android.model.application' m ...

  9. android使用webview上传文件,Android项目中如何在webview页面中上传文件

    Android项目中如何在webview页面中上传文件 发布时间:2020-11-26 15:56:27 来源:亿速云 阅读:68 作者:Leah 本篇文章为大家展示了Android项目中如何在web ...

  10. java fragment_Java Web Fragment在项目中使用方法详解

    Web Fragment 是什么 - 它是在 servlet 3.0开始支持的,可以把一个dy web项目拆分为多个项目,解耦合,使其在项目中开发效率提高,下面我演示简单的项目创建过程 用eclips ...

最新文章

  1. 段页式存储管理方式的定义
  2. UIRemoteNotificationType 参考
  3. AS3.0的int uint Number的使用原则
  4. android系统自动构建,[系统集成] Android 自动构建系统
  5. “管理”解读——浅谈国内IT服务管理产品标准建立的必要性(之一)
  6. 解密昇腾AI处理器--DaVinci架构(计算单元)
  7. Go学习笔记(只有链接)
  8. Spring Cloud 服务注册与发现 [ eureka ]
  9. 输入一个日期,计算这个日期与 2018-03-12差多少天;
  10. CCF201803-4 棋局评估(100分)【博弈+DFS】
  11. Futter基础第20篇: 实现轮播图 flutter_swiper
  12. 为什么密度泛函理论 (DFT) 会低估带隙?
  13. 重置计算机的本地策略,Win10怎样重置组策略/安全策略|Win10重置组策略/安全策略教程...
  14. 开机直接进入键盘布局_win8.1系统苹果电脑开机卡在选择键盘布局界面的解决方法...
  15. 微服务部署之蓝绿发布、滚动发布、灰度发布区别与特点!
  16. Updating Scoop 遇到问题
  17. python密码密文转换_浅论Python密文输入密码的方法
  18. 为什么我从PR里面导出来的视频,在电脑上播放是正常的,微信发给朋友后,形状就变了,扭曲了一样的
  19. VSCode安装和使用教程
  20. 关键遥信量性能缺失的分析报告

热门文章

  1. 又见回文数 NYOJ781
  2. codeup21280:LIS最长不下降子序列问题(可不连续-dp基础题)
  3. 网格搜索、随机搜索和贝叶斯调参总结与python代码实践
  4. 解决ubuntu 20.04 打不开设置的问题
  5. javamailsender注入失败_使用Spring3.x框架的java mail支持来发送邮件
  6. 用计算机弹假面骑士build,假面骑士build使用的武器汇总,你知道几个?
  7. 极客大学架构师训练营 JVM虚拟机原理 JVM垃圾回收原理 Java编程优化 秒杀 第九次作业
  8. 算法:回溯九 Plus在数字字符串中加入加号,求所有情况的和
  9. java 文件上传终止_java文件上传
  10. mos管结电容等效模型_【详解各元器件等效电路】电阻、电容、电感、二极管、MOS管!...