Memcached之——与Spring集成(单服务器)
2015-09-05 20:33
627 查看
转载请注明出处:/article/8380881.html
Memcached客户端与Spring集成,客户端使用的是Memcached-Java-Client-release_2.6.3
1. 配置Maven
<!-- Memcached client --> <dependency> <groupId>com.danga</groupId> <artifactId>memcached-java-client</artifactId> <version>2.6.3</version> </dependency>
2. Properties配置
#######################Memcached配置####################### #服务器地址 memcached.server=127.0.0.1:11211 #初始化时对每个服务器建立的连接数目 memcached.initConn=20 #每个服务器建立最小的连接数 memcached.minConn=10 #每个服务器建立最大的连接数 memcached.maxConn=50 #自查线程周期进行工作,其每次休眠时间 memcached.maintSleep=3000 #Socket的参数,如果是true在写数据时不缓冲,立即发送出去 memcached.nagle=false #Socket阻塞读取数据的超时时间 memcached.socketTO=3000
3. Spring配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- properties config --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="order" value="1"/> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <list> <value>classpath:config/memcached.properties</value> </list> </property> </bean> <!-- Memcached配置 --> <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance" init-method="initialize" destroy-method="shutDown"> <property name="servers"> <list> <value>${memcached.server}</value> </list> </property> <property name="initConn"> <value>${memcached.initConn}</value> </property> <property name="minConn"> <value>${memcached.minConn}</value> </property> <property name="maxConn"> <value>${memcached.maxConn}</value> </property> <property name="maintSleep"> <value>${memcached.maintSleep}</value> </property> <property name="nagle"> <value>${memcached.nagle}</value> </property> <property name="socketTO"> <value>${memcached.socketTO}</value> </property> </bean> </beans>
4. Memcached工具类
package com.wyy.snail.core.util; 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.util.Date; import org.apache.log4j.Logger; import com.danga.MemCached.MemCachedClient; import com.snail.base.utils.DateUtils; /** * * @ClassName: MemcachedUtils * @Description: Memcached工具类 * @author liuyazhuang * @date 2015-6-18 下午5:28:08 * */ public class MemcachedUtils { private static final Logger logger = Logger.getLogger(MemcachedUtils.class); private static MemCachedClient cachedClient; static { if (cachedClient == null) cachedClient = new MemCachedClient(); } 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 */ 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 liuyazhuang * @date 2015-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 + "] " + "- [" + DateUtils.formateTime(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); } } } }
5. 使用工具类操作Memcached
@Test public void testMemcachedSpring() { MemcachedUtils.set("aa", "bb", new Date(1000 * 60)); Object obj = MemcachedUtils.get("aa"); System.out.println("***************************"); System.out.println(obj.toString()); }
相关文章推荐
- 利用nginx+lua+memcache实现灰度发布
- 转载 Memcached BinaryProtocol incr指令内存泄露的bug
- win7 64位 安装memcache扩展的方法
- Redis与Memcached的incr/decr差异对比
- java上的缓存框架-Ehcache,redis,memCache
- redis与memcache区别
- mac下安装memcached
- 缓存算法及Redis、Memcached、Guava、Ehcache中的算法
- Memcached内存管理分析
- Redis使用总结之与Memcached异同
- Memcached和Redis
- Memcached之HA架构(9)
- Memcached之代理服务magent(8)
- redis与memcache区别总结
- MySQL & NoSQL – Memcached 插件
- Memcached
- CI使用Memcached
- Centos7安装Memcached
- XMemcached实例及与spring的集成
- PHP memcache实现消息队列实例