一:安装
第一步:下载memcache.exe安装包,并解压到指定目录,比如说解压到d:/memcached/下
第二
步
:运行cmd ,输入命令d:/memcached/memcached.exe -d install 进行安装
第三
步
:启动memcached.exe,输入命令
d:/memcached/memcached.exe -d start,停止则为.....stop
第四
步
:测试是否安装成功:运行telnet 127.0.0.1 11211,
进入后先按ctrl+]启动回示功能
二:整合
第一步:导入依赖包
<dependency>
<groupId>com.whalin</groupId>
<artifactId>Memcached-Java-Client</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.6</version>
</dependency>
第二步:配置文件
1 .propertie配置 ,新增一个memcached.properties(名字随意起),写入以下内容
#服务器地址
memcached.server=172.168.0.55:11211 //本地地址
#初始化时对每个服务器建立的连接数目
memcached.initConn=20
#每个服务器建立最小的连接数
memcached.minConn=10
#每个服务器建立最大的连接数
memcached.maxConn=50
#自查线程周期进行工作,其每次休眠时间
memcached.maintSleep=3000
#Socket的参数,如果是true在写数据时不缓冲,立即发送出去
memcached.nagle=false
#Socket阻塞读取数据的超时时间
memcached.socketTO=3000
2 .xml配置,新增一个spring-memcached.xml(名字随意起),写入一下内容
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.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:memcached.properties</value>
</list>
</property>
</bean>
<!-- Memcached配置 -->
<bean id="memcachedPool" class="com.whalin.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>
第三步:memcached工具类,写入以下内容
package api;
import com.whalin.MemCached.MemCachedClient;
import org.apache.log4j.Logger;
import java.io.*;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.Date;
/**
* Created with IntelliJ IDEA.
* User: Cao
* Date: 16-3-7
* Time: 下午3:27
* To change this template use File | Settings | File Templates.
*/
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 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 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);
}
}
}
}
第四步:进行测试
@Before
public void Before() {
resource = new ClassPathXmlApplicationContext(new String[] {"spring-memcached.xml"});
}//进行加载
@Test
public void test7(){
boolean flag = MemcachedUtils.set("name", "曹玉伟", new Date(1000 * 20));//1000*20代表20秒
System.out.println(flag);
Object obj = MemcachedUtils.get("name");
System.out.println(obj.toString());
}