memcached的应用(一)

来源:互联网 发布:sql 查询最高分数的人 编辑:程序博客网 时间:2024/05/16 10:45

        由于memcached技术是在设计系统或网站访问量非常大之后才能发挥它真正的作用的,所以一般memcahced的出现都是在后面系统升级改版才会加入的,那么这也就面临着一个很大的问题就是代码的修改,大的系统或网站逻辑层的代码量是非常的大,所以只能想在不修改原类里面的代码的基础上只增加一个独立的memcached层来完成升级和改版。这就要spring aop发挥作用了——环绕通知。

       基本思路其实也很简单,也就是在要查询数据之前转到memcached容器中查询而后直接返回数据而不去数据库中查询,这也是为什么要用环绕通知的原因,因为只有用环绕通知才可以改变程序原来的执行路线。同理,在对数据进行增删改的前先转向memcached容器再对数据库里数据进行增删改,当然还有一个执行路线是,仅仅对memcached容器里面的数据进行增删改,这样做的缺点就是对数据没有进行备份,一旦memcahced服务端出现问题,数据就会丢失。

       下面主要是通过代码的粘贴来进行讲述:

       1、SockIOPool建立;

       2、最好自己对memcached里面的方法进行自己的封装——优点就是可以再使用的时候更简洁,在出异常的时候能够快速找到错误的地方;

       3、一个实现MethodInterceptor接口的类,实现里面的方法invoke(MethodInvocation invocation);

       4、配置spring的配置文件。

       就是这么4步就基本上完成了memcahced的引入。

      下面就是代码(按上面的步骤):

      1、

import org.apache.log4j.Logger;import com.whalin.MemCached.SockIOPool;/** * SockIOPool初始化 * @author duan * */public class SockIOPoolInit {private static Logger logger = Logger.getLogger(SockIOPoolInit.class);private SockIOPool pool = null;    // SockIOPool参数private String serverlist = "192.168.1.186:11211";private int initConn = 5;private int minConn = 5;private int maxConn = 50;private int maxIdle = 1000;private long maintSleep = 30;private int socketTO = 3000;private int socketConnectTO = 0;private boolean nagle = false;/** * 初始化SockIOPool */public void init() {logger.info("Initializing memcached start.");if (pool == null) {try {pool = SockIOPool.getInstance();pool.setServers(serverlist.split(","));if (!pool.isInitialized()) {pool.setInitConn(initConn);pool.setMinConn(minConn);pool.setMaxConn(maxConn);pool.setMaxIdle(maxIdle);pool.setMaintSleep(maintSleep);pool.setNagle(nagle);pool.setSocketTO(socketTO);pool.setSocketConnectTO(socketConnectTO);pool.initialize();}} catch (Exception ex) {logger.error(ex.getMessage());}}logger.info("Initializing Memcached ok!");}public void setPool(SockIOPool pool) {this.pool = pool;}public void setServerlist(String serverlist) {this.serverlist = serverlist;}public void setInitConn(String initConn) {this.initConn = Integer.valueOf(initConn);}public void setMinConn(String minConn) {this.minConn = Integer.valueOf(minConn);}public void setMaxConn(String maxConn) {this.maxConn = Integer.valueOf(maxConn);}public void setMaxIdle(String maxIdle) {this.maxIdle = Integer.valueOf(maxIdle);}public void setMaintSleep(String maintSleep) {this.maintSleep = Long.valueOf(maintSleep);}public void setSocketTO(String socketTO) {this.socketTO = Integer.valueOf(socketTO);}public void setSocketConnectTO(String socketConnectTO) {this.socketConnectTO = Integer.valueOf(socketConnectTO);}public void setNagle(String nagle) {this.nagle = Boolean.valueOf(nagle);}}

      2、

import java.util.ArrayList;import java.util.Date;import java.util.List;import org.apache.log4j.Logger;import com.whalin.MemCached.MemCachedClient;public class MemcachedConnection {private static Logger logger = Logger.getLogger(MemcachedConnection.class);private static MemCachedClient mcc = new MemCachedClient();    public boolean add(String key, Object value) {try {return mcc.add(key,value);} catch (Exception e) {logger.info("cached add error");}return false;}public boolean add(String key, Object value, Date expiry) {try {return mcc.add(key, value, expiry);} catch (Exception e) {logger.info("cached add error");}return false;}public boolean replace(String key, Object value) {try {return mcc.replace(key, value);} catch (Exception e) {logger.info("cached replace error");}return false;}public boolean replace(String key, Object value, Date expiry) {try {return mcc.replace(key, value, expiry);} catch (Exception e) {logger.info("cached replace error");}return false;}public boolean delete(String key) {try {return mcc.delete(key);} catch (Exception e) {logger.info("cached delete error");}return false;}public boolean delete(String key ,Date expiry) {try {return mcc.delete(key,expiry);} catch (Exception e) {logger.info("cached delete error");}return false;}public Object get(String key) {try {return mcc.get(key);} catch (Exception e) {logger.info("cached get error");}return null;}public Object getAll() {List list = new ArrayList();try {for(int i=100;i>0;i--){//System.out.println("vbbbb");Object object = get(String.valueOf(i));                 if(object==null){                continue;                                 }else{                 list.add(object);                 }                 if(list.size() ==4){                 return list;                 }}return list;} catch (Exception e) {logger.info("cached get error");}return null;}public Object getMulti(String[] keys) {try {return mcc.getMulti(keys);} catch (Exception e) {logger.info("cached getMulti error");}return null;}public Object gets(String key){try {return mcc.gets(key);} catch (Exception e) {logger.info("cached gets error");}return null;}public boolean storeCounter(String key,Long counter){try {return mcc.storeCounter(key, counter);} catch (Exception e) {logger.info("cached storeCounter error");}return false;} public Long getCounter(String key){try {return mcc.getCounter(key);} catch (Exception e) {logger.info("cached incr error");}return -1L;}public Long incr(String key){try {return mcc.incr(key);} catch (Exception e) {logger.info("cached incr error");}return -1L;}public Long decr(String key){try {return mcc.decr(key);} catch (Exception e) {logger.info("cached decr error");}return -1L;}public boolean set(String key, Object value) {try {return mcc.set(key, value);} catch (Exception e) {logger.info("cached set error");}return false;}public boolean set(String key, Object value, Date expiry) {try {return mcc.set(key, value, expiry);} catch (Exception e) {logger.info("cached set error");}return false;}public boolean keyExist(String key) {try {return mcc.keyExists(key);} catch (Exception e) {logger.info("cached keyExists error");}return false;}public boolean prepend(String key,Object value) {try {return mcc.prepend(key, value);} catch (Exception e) {logger.info("cached keyExists error");}return false;}}
      3、实现MethodInterceptor接口

import java.util.ArrayList;import java.util.List;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import org.apache.log4j.Logger;import com.yst.test.memcached.MemcachedConnection;import com.yst.test.model.StudentInfo;public class AroundService implements MethodInterceptor {private static Logger logger = Logger.getLogger(AroundService.class);private MemcachedConnection memcachedConnection;public MemcachedConnection getMemcachedConnection() {return memcachedConnection;}public void setMemcachedConnection(MemcachedConnection memcachedConnection) {this.memcachedConnection = memcachedConnection;}@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {logger.info("around is starting……");// Object[] arguments=invocation.getArguments();// logger.info("invocation arguments[0] name:"+arguments[0]);if (memcachedConnection == null) {return invocation.proceed();} else {String methodName = invocation.getMethod().getName();Object[] arguments = invocation.getArguments();logger.info("invocation method name:"+ invocation.getMethod().getName());if (methodName.equals("getAllStuInfo")) {Object object = memcachedConnection.getAll();if (object == null) {} else {return object;}} else if (methodName.equals("addStuInfo")) {StudentInfo studentInfo = (StudentInfo) arguments[0];memcachedConnection.add(String.valueOf(studentInfo.getId()),studentInfo);try {Object o = invocation.proceed();if ((Boolean) o == false) {memcachedConnection.delete(String.valueOf(studentInfo.getId()));logger.info("studentInfo(id=" + studentInfo.getId()+ ") already delete");}return o;} catch (Exception e) {memcachedConnection.delete(String.valueOf(studentInfo.getId()));logger.info("studentInfo(id=" + studentInfo.getId()+ ") already delete");}} else if (methodName.equals("delStuInfoById")) {String id = (String) arguments[0];memcachedConnection.delete(id);try {Object o = invocation.proceed();if ((Boolean) o == false) {memcachedConnection.delete(String.valueOf(id));logger.info("studentInfo(id=" + id+ ") already delete");}return o;} catch (Exception e) {memcachedConnection.delete(String.valueOf(id));logger.info("studentInfo(id=" + id + ") already delete");}} else if (methodName.equals("updateStuInfo")) {StudentInfo studentInfo = (StudentInfo) arguments[0];memcachedConnection.replace(String.valueOf(studentInfo.getId()), studentInfo);try {Object o = invocation.proceed();if ((Boolean) o == false) {memcachedConnection.delete(String.valueOf(studentInfo.getId()));logger.info("studentInfo(id=" + studentInfo.getId()+ ") already delete");}return o;} catch (Exception e) {memcachedConnection.delete(String.valueOf(studentInfo.getId()));logger.info("studentInfo(id=" + studentInfo.getId()+ ") already delete");}} else if (methodName.equals("getStudentInfo")) {return null;} else {return invocation.proceed();}}logger.info("around is over……");return null;}}
    4、配置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"xsi:schemaLocation="http://www.springframework.org/schema/beans         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd "><import resource="/hessian-servlet.xml" /><!-- jdbc.properties文件路径 --><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"> <list>     <value>classpath:/com/jdbc.properties</value>     <value>classpath:/com/cached.properties</value> </list></property></bean><!-- 配置数据源 --><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="${url}" /><property name="username" value="${users}" /><property name="password" value="${passwords}" /></bean><!-- 配置sqlSessionFactory --><bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"><property name="configLocation" value="classpath:ibatis.xml"></property><property name="dataSource" ref="dataSource" /></bean><!-- 配置事务管理器 --><bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><!-- 配置事务拦截器 --><bean id="transactionInterceptor"class="org.springframework.transaction.interceptor.TransactionInterceptor"><!-- 事务拦截器bean需要依赖注入一个事务管理器 --><property name="transactionManager" ref="transactionManager" /><property name="transactionAttributes"><!-- 下面定义事务传播属性 --><props><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop><prop key="*">PROPAGATION_REQUIRED</prop></props></property></bean><!-- 配置业务代理 --><beanclass="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"><!-- 指定对满足哪些bean name的bean自动生成业务代理 --><property name="beanNames"><!-- 下面是所有需要自动创建事务代理的bean --><list><value>studentInfoServiceImpl</value></list><!-- 此处可增加其他需要自动创建事务代理的bean --></property><!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器 --><property name="interceptorNames"><list><!-- 此处可增加其他新的Interceptor --><value>transactionInterceptor</value></list></property></bean><!-- SockIOPoolInit配置,初始化 --><bean class="com.yst.test.memcached.SockIOPoolInit" init-method="init"><property name="serverlist" value="${serverlist}" /><property name="initConn" value="${initConn}" /><property name="minConn" value="${minConn}" /><property name="maxConn" value="${maxConn}" /><property name="maxIdle" value="${maxIdle}" /><property name="maintSleep" value="${maintSleep}" /><property name="socketTO" value="${socketTO}" /><property name="socketConnectTO" value="${socketConnectTO}" /><property name="nagle" value="${nagle}" /></bean><!-- memcached配置 --><bean id="memcachedConnection" class="com.yst.test.memcached.MemcachedConnection" /><!-- aop环绕通知配置 --><bean id="aroundService" class="com.yst.aop.around.AroundService">    <property name="memcachedConnection" ref="memcachedConnection"></property></bean><!-- dao依赖配置 --><bean id="studentInfoDaoImpl" class="com.yst.test.dao.impl.StudentInfoDaoImpl"><property name="sqlMapClient" ref="sqlMapClient" /></bean><!-- service依赖配置 --><bean id="studentInfoServiceImpl" class="com.yst.test.service.impl.StudentInfoServiceImpl"><property name="studentInfoDaoImpl" ref="studentInfoDaoImpl" /></bean><!-- aop环绕通知配置代理配置 --><bean id="studentInfoServiceImplProxy" class="org.springframework.aop.framework.ProxyFactoryBean"><property name="proxyInterfaces" value="com.yst.test.service.StudentInfoService" /><property name="interceptorNames"><list><value>aroundService</value></list></property><property name="target" ref="studentInfoServiceImpl"></property></bean></beans>  

      

       


       

       

原创粉丝点击