Memcached客戶端(memcached-Java-client)與 Spring整合(單伺服器)
阿新 • • 發佈:2019-01-08
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.6</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-memcache.xml配置
注意:在spring配置檔案中要引入spring-memcache.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" 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-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.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.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> <constructor-arg> <value>memcachedPool</value> </constructor-arg> </bean> <bean id="memcachedClient" class="com.danga.MemCached.MemCachedClient"> <constructor-arg><value>memcachedPool</value></constructor-arg> </bean> </beans>
<import resource="spring-memcache.xml"/>
<beans:bean id="memcachedUtils" class="cn.csdb.utils.MemcachedUtils">
<beans:property name="memcachedClient" ref="memcachedClient"/>
</beans:bean>
4. Memcached工具類
package cn.csdb.utils;
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 org.springframework.beans.factory.annotation.Autowired;
import cn.csdb.commons.util.datetime.DateUtils;
import com.danga.MemCached.MemCachedClient;
/**
* MemcachedUtils
* Memcached工具類
* @author zhengbo
*
*/
public class MemcachedUtils {
public static final Logger logger = Logger.getLogger(MemcachedUtils.class);
public static MemCachedClient memcachedClient;
public static MemCachedClient getMemcachedClient() {
return memcachedClient;
}
public static void setMemcachedClient(MemCachedClient memcachedClient) {
MemcachedUtils.memcachedClient = memcachedClient;
}
/**
* 向快取新增新的鍵值對。如果鍵已經存在,則之前的值將被替換。
* @param key 鍵
* @param value 值
* @return
*/
public boolean set(String key, Object value) {
return setExp(key, value, null);
}
/**
* 向快取新增新的鍵值對。如果鍵已經存在,則之前的值將被替換。
* @param key 鍵
* @param value 值
* @param expire 過期時間 New Date(1000*10):十秒後過期
* @return
*/
public 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 boolean setExp(String key, Object value, Date expire) {
boolean flag = false;
try {
flag = memcachedClient.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 boolean add(String key, Object value) {
return addExp(key, value, null);
}
/**
* 僅當快取中不存在鍵時,add 命令才會向快取中新增一個鍵值對。
* @param key 鍵
* @param value 值
* @param expire 過期時間 New Date(1000*10):十秒後過期
* @return
*/
public 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 boolean addExp(String key, Object value, Date expire) {
boolean flag = false;
try {
flag = memcachedClient.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 boolean replace(String key, Object value) {
return replaceExp(key, value, null);
}
/**
* 僅當鍵已經存在時,replace 命令才會替換快取中的鍵。
*
* @param key 鍵
* @param value 值
* @param expire 過期時間 New Date(1000*10):十秒後過期
* @return
*/
public 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 boolean replaceExp(String key, Object value, Date expire) {
boolean flag = false;
try {
flag = memcachedClient.replace(key, value, expire);
} catch (Exception e) {
MemcachedLog.writeLog("Memcached replace方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));
}
return flag;
}
/**
* get 命令用於檢索與之前新增的鍵值對相關的值。
* @param key 鍵
* @return
*/
public Object get(String key) {
Object obj = null;
try {
obj = memcachedClient.get(key);
} catch (Exception e) {
MemcachedLog.writeLog("Memcached get方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));
}
return obj;
}
/**
* 刪除 memcached 中的任何現有值。
* @param key 鍵
* @return
*/
public boolean delete(String key) {
return deleteExp(key, null);
}
/**
* 刪除 memcached 中的任何現有值。
* @param key 鍵
* @param expire 過期時間 New Date(1000*10):十秒後過期
* @return
*/
public boolean delete(String key, Date expire) {
return deleteExp(key, expire);
}
/**
* 刪除 memcached 中的任何現有值。
*
* @param key 鍵
* @param expire 過期時間 New Date(1000*10):十秒後過期
* @return
*/
private boolean deleteExp(String key, Date expire) {
boolean flag = false;
try {
flag = memcachedClient.delete(key, expire);
} catch (Exception e) {
MemcachedLog.writeLog("Memcached delete方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));
}
return flag;
}
/**
* 清理快取中的所有鍵/值對
* @return
*/
public boolean flashAll() {
boolean flag = false;
try {
flag = memcachedClient.flushAll();
} catch (Exception e) {
MemcachedLog.writeLog("Memcached flashAll方法報錯\r\n" + exceptionWrite(e));
}
return flag;
}
/**
* 返回異常棧資訊,String型別
* @param e
* @return
*/
private 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日誌記錄
*/
private static class MemcachedLog {
private final String MEMCACHED_LOG = "D:\\memcached.log";
private final 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();
/**
* 初始化寫入流
*/
{
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.getCurrentDateString() + "]\r\n"
+ content);
logWrite.newLine();
logWrite.flush();
} catch (IOException e) {
logger.error("memcached 寫入日誌資訊失敗", e);
}
}
/**
* 關閉流
*/
private void closeLogStream() {
try {
fileWriter.close();
logWrite.close();
} catch (IOException e) {
logger.error("memcached 日誌物件關閉失敗", e);
}
}
}
}
5. 使用工具類操作Memcached
public class test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
MemCachedClient mc = (MemCachedClient)ctx.getBean("memcachedClient");
for(int i=0; i<100; i++){
mc.set("key"+i, "value"+i);
}
try{Thread.sleep(5000);}catch(Exception e){}
for(int i=0; i<100; i++){
System.out.println("get "+i+" value "+mc.get("key"+i));
}
}
}