spring与memcache的整合
生活随笔
收集整理的這篇文章主要介紹了
spring与memcache的整合
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
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><!-- 可以設(shè)置多個memcached服務(wù)器 --><property name="servers"><list><value>${memcache_ip}</value></list></property><!-- 每個服務(wù)器初始連接數(shù) --><property name="initConn"><value>10</value></property><!-- 每個服務(wù)器最小連接數(shù) --><property name="minConn"><value>5</value></property><!-- 每個服務(wù)器最大連接數(shù) --><property name="maxConn"><value>250</value></property><!-- 主線程睡眠時間 --><property name="maintSleep"><value>30</value></property><!-- TCP/Socket的參數(shù),如果是true在寫數(shù)據(jù)時不緩沖,立即發(fā)送出去參數(shù) --><property name="nagle"><value>false</value></property><!-- 連接超時/阻塞讀取數(shù)據(jù)的超時間是 --><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() {} /** * 向緩存添加新的鍵值對。如果鍵已經(jīng)存在,則之前的值將被替換。 * * @param key * 鍵 * @param value * 值 * @return */ public static boolean set(String key, Object value) { return setExp(key, value, null); } /** * 向緩存添加新的鍵值對。如果鍵已經(jīng)存在,則之前的值將被替換。 * * @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); } /** * 向緩存添加新的鍵值對。如果鍵已經(jīng)存在,則之前的值將被替換。 * * @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; } /** * 僅當(dāng)緩存中不存在鍵時,add 命令才會向緩存中添加一個鍵值對。 * * @param key * 鍵 * @param value * 值 * @return */ public static boolean add(String key, Object value) { return addExp(key, value, null); } /** * 僅當(dāng)緩存中不存在鍵時,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); } /** * 僅當(dāng)緩存中不存在鍵時,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; } /** * 僅當(dāng)鍵已經(jīng)存在時,replace 命令才會替換緩存中的鍵。 * * @param key * 鍵 * @param value * 值 * @return */ public static boolean replace(String key, Object value) { return replaceExp(key, value, null); } /** * 僅當(dāng)鍵已經(jīng)存在時,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); } /** * 僅當(dāng)鍵已經(jīng)存在時,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 命令用于檢索與之前添加的鍵值對相關(guān)的值。 * * @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 中的任何現(xiàn)有值。 * * @param key * 鍵 * @return */ public static boolean delete(String key) { return deleteExp(key, null); } /** * 刪除 memcached 中的任何現(xiàn)有值。 * * @param key * 鍵 * @param expire * 過期時間 New Date(1000*10):十秒后過期 * @return */ public static boolean delete(String key, Date expire) { return deleteExp(key, expire); } /** * 刪除 memcached 中的任何現(xiàn)有值。 * * @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,可以找到對應(yīng)的JVM進(jìn)程 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 * 日志內(nèi)容 */ 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); } } /** * 關(guān)閉流 */ private static void closeLogStream() { try { fileWriter.close(); logWrite.close(); } catch (IOException e) { logger.error("memcached 日志對象關(guān)閉失敗", e); } } } }4. app-config.xml(idc,dev,test,prd各自環(huán)境)
memcache_ip=192.168.1.10:112115. 使用
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);}}?參考文獻(xiàn)
【1】http://www.cnblogs.com/xiaoqingxin/p/4132391.html
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/5064145.html
總結(jié)
以上是生活随笔為你收集整理的spring与memcache的整合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 涉及支付,资金方案的操作要考虑的问题
- 下一篇: 源码分析netty服务器创建过程vs j