1. pom.xml文件增加:

<dependency><groupId>com.whalin</groupId><artifactId>Memcached-Java-Client</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.6.2</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.2</version></dependency><dependency><groupId>commons-pool</groupId><artifactId>commons-pool</artifactId><version>1.5.6</version></dependency>

2. app-cache.xml配置

<bean id="memcachedPool" class="com.whalin.MemCached.SockIOPool" factory-method="getInstance" init-method="initialize" lazy-init="false" destroy-method="shutDown"><constructor-arg><value>memcachedPool</value></constructor-arg><!-- 可以设置多个memcached服务器 --><property name="servers"><list><value>${memcache_ip}</value></list></property><!-- 每个服务器初始连接数 --><property name="initConn"><value>10</value></property><!-- 每个服务器最小连接数 --><property name="minConn"><value>5</value></property><!-- 每个服务器最大连接数 --><property name="maxConn"><value>250</value></property><!-- 主线程睡眠时间 --><property name="maintSleep"><value>30</value></property><!-- TCP/Socket的参数,如果是true在写数据时不缓冲,立即发送出去参数 --><property name="nagle"><value>false</value></property><!-- 连接超时/阻塞读取数据的超时间是 --><property name="socketTO"><value>3000</value></property></bean><bean id="memcachedClient" class="com.whalin.MemCached.MemCachedClient" ><constructor-arg><value>memcachedPool</value></constructor-arg></bean>

3. 工具类MemcachedUtils

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.text.SimpleDateFormat;
import java.util.Date;import org.apache.log4j.Logger;import com.whalin.MemCached.MemCachedClient;public class MemcachedUtils {private static final Logger logger = Logger.getLogger(MemcachedUtils.class);  private static MemCachedClient cachedClient;  static {  if (cachedClient == null)  cachedClient = new MemCachedClient("memcachedPool");  }  private MemcachedUtils() {}  /** * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。 *  * @param key *            键 * @param value *            值 * @return */  public static boolean set(String key, Object value) {  return setExp(key, value, null);  }  /** * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。 *  * @param key *            键 * @param value *            值 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  public static boolean set(String key, Object value, Date expire) {  return setExp(key, value, expire);  }  /** * 向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。 *  * @param key *            键 * @param value *            值 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  private static boolean setExp(String key, Object value, Date expire) {  boolean flag = false;  try {  flag = cachedClient.set(key, value, expire);  } catch (Exception e) {  // 记录Memcached日志  MemcachedLog.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWrite(e));  }  return flag;  }  /** * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。 *  * @param key *            键 * @param value *            值 * @return */  public static boolean add(String key, Object value) {  return addExp(key, value, null);  }  /** * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。 *  * @param key *            键 * @param value *            值 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  public static boolean add(String key, Object value, Date expire) {  return addExp(key, value, expire);  }  /** * 仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。 *  * @param key *            键 * @param value *            值 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  private static boolean addExp(String key, Object value, Date expire) {  boolean flag = false;  try {  flag = cachedClient.add(key, value, expire);  } catch (Exception e) {  // 记录Memcached日志  MemcachedLog.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(e));  }  return flag;  }  /** * 仅当键已经存在时,replace 命令才会替换缓存中的键。 *  * @param key *            键 * @param value *            值 * @return */  public static boolean replace(String key, Object value) {  return replaceExp(key, value, null);  }  /** * 仅当键已经存在时,replace 命令才会替换缓存中的键。 *  * @param key *            键 * @param value *            值 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  public static boolean replace(String key, Object value, Date expire) {  return replaceExp(key, value, expire);  }  /** * 仅当键已经存在时,replace 命令才会替换缓存中的键。 *  * @param key *            键 * @param value *            值 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  private static boolean replaceExp(String key, Object value, Date expire) {  boolean flag = false;  try {  flag = cachedClient.replace(key, value, expire);  } catch (Exception e) {  MemcachedLog.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWrite(e));  }  return flag;  }  /** * get 命令用于检索与之前添加的键值对相关的值。 *  * @param key *            键 * @return */  public static Object get(String key) {  Object obj = null;  try {  obj = cachedClient.get(key);  } catch (Exception e) {  MemcachedLog.writeLog("Memcached get方法报错,key值:" + key + "\r\n" + exceptionWrite(e));  }  return obj;  }  /** * 删除 memcached 中的任何现有值。 *  * @param key *            键 * @return */  public static boolean delete(String key) {  return deleteExp(key, null);  }  /** * 删除 memcached 中的任何现有值。 *  * @param key *            键 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  public static boolean delete(String key, Date expire) {  return deleteExp(key, expire);  }  /** * 删除 memcached 中的任何现有值。 *  * @param key *            键 * @param expire *            过期时间 New Date(1000*10):十秒后过期 * @return */  @SuppressWarnings("deprecation")private static boolean deleteExp(String key, Date expire) {  boolean flag = false;  try {  flag = cachedClient.delete(key, expire);  } catch (Exception e) {  MemcachedLog.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWrite(e));  }  return flag;  }  /** * 清理缓存中的所有键/值对 *  * @return */  public static boolean flashAll() {  boolean flag = false;  try {  flag = cachedClient.flushAll();  } catch (Exception e) {  MemcachedLog.writeLog("Memcached flashAll方法报错\r\n" + exceptionWrite(e));  }  return flag;  }  /** * 返回异常栈信息,String类型 *  * @param e * @return */  private static String exceptionWrite(Exception e) {  StringWriter sw = new StringWriter();  PrintWriter pw = new PrintWriter(sw);  e.printStackTrace(pw);  pw.flush();  return sw.toString();  }  /** *  * @ClassName: MemcachedLog * @Description: Memcached日志记录 * @author yinjw * @date 2014-6-18 下午5:01:37 *  */  private static class MemcachedLog {  private final static String MEMCACHED_LOG = "D:\\memcached.log";  private final static String LINUX_MEMCACHED_LOG = "/usr/local/logs/memcached.log";  private static FileWriter fileWriter;  private static BufferedWriter logWrite;  // 获取PID,可以找到对应的JVM进程  private final static RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();  private final static String PID = runtime.getName();  /** * 初始化写入流 */  static {  try {  String osName = System.getProperty("os.name");  if (osName.indexOf("Windows") == -1) {  fileWriter = new FileWriter(MEMCACHED_LOG, true);  } else {  fileWriter = new FileWriter(LINUX_MEMCACHED_LOG, true);  }  logWrite = new BufferedWriter(fileWriter);  } catch (IOException e) {  logger.error("memcached 日志初始化失败", e);  closeLogStream();  }  }  /** * 写入日志信息 *  * @param content *            日志内容 */  public static void writeLog(String content) {  try {  logWrite.write("[" + PID + "] " + "- [" + new SimpleDateFormat("yyyy年-MM月-dd日 hh时:mm分:ss秒").format(new Date().getTime()) + "]\r\n"  + content);  logWrite.newLine();  logWrite.flush();  } catch (IOException e) {  logger.error("memcached 写入日志信息失败", e);  }  }  /** * 关闭流 */  private static void closeLogStream() {  try {  fileWriter.close();  logWrite.close();  } catch (IOException e) {  logger.error("memcached 日志对象关闭失败", e);  }  }  }
}

4. app-config.xml(idc,dev,test,prd各自环境)

memcache_ip=192.168.1.10:11211

5. 使用

public class MemCacheController {private final Logger logger = LoggerFactory.getLogger(getClass());/*** 查找memcache中的key* @param key* @return*/@RequestMapping(value = "/findSessionByKey", method = {RequestMethod.POST, RequestMethod.GET})@ResponseBodypublic String findByKey(@RequestParam String key){logger.info("MemCacheController.findByKey param:key="+key);if(StringUtils.isEmpty(key)){return "key must not be empty or null!";}return (String)MemcachedUtils.get(key);}}

参考文献

【1】http://www.cnblogs.com/xiaoqingxin/p/4132391.html

转载于:https://www.cnblogs.com/davidwang456/p/5064145.html

spring与memcache的整合相关推荐

  1. Spring Boot 2.x整合Quartz

    宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo- 开发文档 www.kancloud.cn/ex ...

  2. velocity mybatis spring 在maven的整合开发(二)

    2019独角兽企业重金招聘Python工程师标准>>> 对于一个web项目,位于WEB-INFO下的web.xml永远是该项目的总配置. 我的web.xml <?xml ver ...

  3. Struts2与Spring、Hibernate三者整合的过程示例

    转载地址:http://www.360doc.com/content/09/0416/09/61497_3148602.shtml# 原来spring配置文件自动生成数据源和整合先后有关系,留着做个提 ...

  4. Spring与Quartz的整合实现定时任务调度

    Spring与Quartz的整合实现定时任务调度 摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然 ...

  5. Spring与日志的整合

    Spring 与日志框架进行整合,日志框架就可以在控制台中,输出Spring框架运行过程中的⼀ 些重要的信息. 好处:便于了解Spring框架的运行过程,利于程序的调试. 默认日志框架 Spring ...

  6. spring学习笔记06-spring整合junit(出现的问题,解决的思路)

    spring学习笔记06-spring整合junit(出现的问题,解决的思路) 文章目录 spring学习笔记06-spring整合junit(出现的问题,解决的思路) 3.1测试类中的问题和解决思路 ...

  7. Spring与Struts框架整合

    Spring,负责对象对象创建 Struts,用Action处理请求 Spring与Struts框架整合,关键点:让struts框架action对象的创建,交给spring完成! 1.步骤: 引入ja ...

  8. SSM框架Spring+SpringMVC+MyBatis——详细整合教程

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参 ...

  9. spring boot使用Jedis整合Redis

    文章目录 spring boot使用jedis整合redis 总结 Spring Boot整合Redis有两种方式,分别是Jedis和RedisTemplate,那么它们二者有什么区别呢? 1.Jed ...

最新文章

  1. 工作流引擎在视频网站架构中的应用
  2. linux版本photoshop,在linux上使用ps(转载)
  3. linux下安装mysql5.7.19,Linux下MySQL5.1升级到高版本MySQL5.7.19详解 | zifangsky的个人博客...
  4. 某娱乐资源网同款网站源码
  5. linux下硬盘测速工具hdparm
  6. 【算法】剑指 Offer 45. 把数组排成最小的数 【重刷】
  7. C#事件-趣谈事件与委托
  8. 数据解析1:XML解析(1)
  9. Mysql数据库知识总结
  10. 关于java中equals与==的区别的小实验
  11. PandoraBox潘多拉无线桥接(中继)使用方法和无法使用解决----小米mini小米3路由
  12. num =10在c语言中是什么意思,num是什么词性
  13. 水木周平戏说中国网络黑幽默!
  14. 打造黑苹果(五)设置MACOS系统盘引导,以及安装驱动
  15. 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
  16. Android抽象任务管理框架QTaskManager及其使用方式介绍
  17. Filezilla 连接不上 Error: Connection timed out after 20 seconds of inactivity
  18. 华为qq邮箱服务器密码忘了,华为自带的电子邮件APP怎么用?一招教你快速登录QQ/网易邮箱...
  19. python:list能像数值一样做运算么?
  20. C++中sort()排序函数应用

热门文章

  1. linux扫描hba卡命令,如何在redhat中查看HBA卡的信息
  2. c 定义结构体时提示应输入声明_C语言结构体的坑很多,这6大方法千万要记住!...
  3. java中的stack类和C++中的stack类的区别
  4. kylin linux 安装教程,新手入门必备:kylin安装教程介绍!
  5. 初识广播机制(监听网络状态的改变,监听网络是否可以使用)
  6. 安卓禁止ScrollView内的控件改变之后自动滚动
  7. java 隐藏文件_java-如何仅列出jtree中的非隐藏文件和非系...
  8. C++基类和派生类的析构函数
  9. keras cnn 代码详解
  10. 在单链表和双链表中删除倒数第K个节点