memcached与spring集成
一、背景
銷售CRM(項目A)將負責管理項目信息系統(項目B)的支付與權限
上級要求為避免頻繁調用CRM接口,中間放一級緩存,但要做到緩存中保證最新數據
因項目B已使用memcache作緩存,所以決定使用memcache
二、設計
1、統一系統交互方式,確保系統與系統間調用只有一個接口,接口參數為(String action, String data),以action區別調用是什么方法
2、封裝簡單的memcache工具類,可執行簡單的增刪改查
3、memcache單獨一個日志文件,方便查找原因
4、項目A,采用AOP攔截,在對數據進行增刪改時,對緩存中數據進行同步操作
5、為項目B再次封裝memcache工具類的查詢方法,確保在緩存查不到數據時,調用項目A的接口,將數據放于緩存
本文主要講解memcache與spring的集成,這些設計不在講解范圍內(貌似講了一堆廢話,哈哈)
三、memcache與Spring集成
?memcache決定使用memcached client java客戶端,原因是其使用較為廣泛,單純求穩妥
在項目/src/main/resources/property下有三個配置文件,分別對應開發環境、預上線、正式線
修改配置文件,增加
#######################設置Memcached服務器參數####################### #設置服務器地址 memcached.server=172.16.231.230:11211 #容錯 memcached.failOver=true #設置初始連接數 memcached.initConn=20 #設置最小連接數 memcached.minConn=10 #設置最大連接數 memcached.maxConn=250 #設置連接池維護線程的睡眠時間 memcached.maintSleep=3000 #設置是否使用Nagle算法(Socket的參數),如果是true在寫數據時不緩沖,立即發送出去 memcached.nagle=false #設置socket的讀取等待超時時間 memcached.socketTO=3000 #設置連接心跳監測開關 memcached.aliveCheck=true #######################設置Memcached服務器參數#######################?
因預上線、與線上環境為封閉環境,memcache服務器地址在不同配置文件中各有不同
可直接在spring的配置文件中增加memcache的配置,在這選擇在/src/main/resources中增加memcached-context.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-3.2.xsdhttp://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.1.xsd"><!-- 加載初始化配置文件 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>classpath:property/init.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>?
因在spring配置文件中已加載了初始化配置文件,所以在這不需要再加載,如果沒有加載過,應放開注釋
修改web.xml,增加memcached-content.xml
<!-- spring配置文件 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext.xml,classpath*:memcached-content.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><listener><listener-class>com.glodon.gcxx.common.ServletContextInit</listener-class></listener>?
至此,配完了。。。。 是的,配完了,下面是工具類的代碼
package com.glodon.gcxx.Interaction.memcached;import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date;import org.apache.log4j.Logger; import org.springframework.stereotype.Component;import com.whalin.MemCached.MemCachedClient;public class MemcachedUtil {private static final Logger logger = Logger.getLogger(MemcachedUtil.class);private static MemCachedClient cachedClient;static {if (cachedClient == null)cachedClient = new MemCachedClient();}/*** @Description 添加新的鍵值對,默認最少使用算法淘汰。如果鍵已經存在,則之前的值將被替換。* @author liuy-8* @date 2015年5月29日 下午2:09:17 * @param key 鍵* @param value 值* @return 是否成功*/public static boolean set(String key, Object value) {return setExp(key, value, null);}/*** @Description 添加新的鍵值對。如果鍵已經存在,則之前的值將被替換。* @author liuy-8* @date 2015年5月29日 下午2:10:08 * @param key 鍵* @param value 值* @param time 過期時間,單位ms* @return 是否成功*/public static boolean set(String key, Object value, int time) {return setExp(key, value, new Date(time));}/*** @Description 添加新的鍵值對。如果鍵已經存在,則之前的值將被替換。* @author liuy-8* @date 2015年5月29日 下午2:13:18 * @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日志logger.error("Memcached set方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));}return flag;}/*** @Description 僅當緩存中不存在鍵時,add 命令才會向緩存中添加一個鍵值對,默認最少使用算法淘汰* @author liuy-8* @date 2015年5月29日 下午2:13:50 * @param key 鍵* @param value 值* @return 是否成功*/public static boolean add(String key, Object value) {return addExp(key, value, null);}/*** @Description 僅當緩存中不存在鍵時,add 命令才會向緩存中添加一個鍵值對* @author liuy-8* @date 2015年5月29日 下午2:27:40 * @param key 鍵* @param value 值* @param time 過期時間,單位毫秒* @return 是否成功*/public static boolean add(String key, Object value, int time) {return addExp(key, value, new Date(time));}/*** @Description 僅當緩存中不存在鍵時,add 命令才會向緩存中添加一個鍵值對* @author liuy-8* @date 2015年5月29日 下午2:30:29 * @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日志logger.error("Memcached add方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));}return flag;}/*** @Description 僅當鍵已經存在時,replace 命令才會替換緩存中的鍵,默認最少使用算法淘汰* @author liuy-8* @date 2015年5月29日 下午2:42:22 * @param key 鍵* @param value 值* @return 是否成功*/public static boolean replace(String key, Object value) {return replaceExp(key, value, null);}/*** @Description 僅當鍵已經存在時,replace 命令才會替換緩存中的鍵。* @author liuy-8* @date 2015年5月29日 下午3:07:51 * @param key 鍵* @param value 值* @param time 過期時間,單位毫秒* @return 是否成功*/public static boolean replace(String key, Object value, int time) {return replaceExp(key, value, new Date(time));}/*** @Description 僅當鍵已經存在時,replace 命令才會替換緩存中的鍵。* @author liuy-8* @date 2015年5月29日 下午3:09:22 * @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) {logger.error("Memcached replace方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));}return flag;}/*** @Description 命令用于檢索與之前添加的鍵值對相關的值* @author liuy-8* @date 2015年5月29日 下午3:09:45 * @param key 鍵* @return 得到與鍵對應的值*/public static Object get(String key) {Object obj = null;try {obj = cachedClient.get(key);} catch (Exception e) {logger.error("Memcached get方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));}return obj;}/*** @Description 刪除 memcached 中的任何現有值。* @author liuy-8* @date 2015年5月29日 下午3:10:57 * @param key 鍵* @return 是否成功*/public static boolean delete(String key) {return deleteExp(key, null);}/*** @Description 刪除 memcached 中的任何現有值。* @author liuy-8* @date 2015年5月29日 下午3:33:39 * @param key 鍵* @param time 阻塞時間,單位ms,禁止使用同樣的鍵保存新數據,set方法除外* @return 是否成功*/public static boolean delete(String key, int time) {return deleteExp(key, new Date(time));}/*** @Description 方法描述說明* @author liuy-8* @date 2015年5月29日 下午3:37:52 * @param key 鍵* @param expire 阻塞時間,單位ms,禁止使用同樣的鍵保存新數據,set方法除外* @return 是否成功*/private static boolean deleteExp(String key, Date expire) {boolean flag = false;try {flag = cachedClient.delete(key, expire);} catch (Exception e) {logger.error("Memcached delete方法報錯,key值:" + key + "\r\n" + exceptionWrite(e));}return flag;}/*** @Description 清理緩存中的所有鍵/值對* @author liuy-8* @date 2015年5月29日 下午3:38:26 * @return 是否成功*/public static boolean flushAll() {boolean flag = false;try {flag = cachedClient.flushAll();} catch (Exception e) {logger.error("Memcached flashAll方法報錯\r\n" + exceptionWrite(e));}return flag;}/*** @Description 返回異常棧信息,String類型* @author liuy-8* @date 2015年5月29日 下午3:38:52 * @param e 異常* @return 異常信息*/private static String exceptionWrite(Exception e) {StringWriter sw = null;PrintWriter pw = null;String errorInfo = "";try {sw = new StringWriter();pw = new PrintWriter(sw);e.printStackTrace(pw);pw.flush();errorInfo = sw.toString();} finally {//關閉PrintWriterif(pw != null)pw.close();//關閉StringWriterif(sw != null){try {sw.close();} catch (IOException e1) {e1.printStackTrace();}}}return errorInfo;}}
?
轉載于:https://www.cnblogs.com/xjyh/p/4545856.html
總結
以上是生活随笔為你收集整理的memcached与spring集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转:Hibernate中Criteria
- 下一篇: ubuntu14.04安装dropbox