spring配置xmemcached及使用

原创文章,请尊重作者的劳动!

本人其他的一些memcached的博客在这里是比较全的

之前写了一些memcached的配置,但是那个和spring的配置是不能用在生产环境的,今天把spring和xmemcached的配置文件告诉一下大家如何配置,

注释的部分是可以配置多个memcached服务器的

<!-- 引入Memcached客户端开始-->

    <bean name="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">        

        <constructor-arg>

            <list>

                <bean class="java.net.InetSocketAddress">

                    <constructor-arg>

                        <value>192.168.100.102</value>

                    </constructor-arg>

                    <constructor-arg>

                        <value>11211</value>

                    </constructor-arg>

                </bean>

                <!-- 

                <bean class="java.net.InetSocketAddress">

                    <constructor-arg>

                        <value>localhost</value>

                    </constructor-arg>

                    <constructor-arg>

                        <value>12001</value>

                    </constructor-arg>

                </bean>

                 -->

            </list>

        </constructor-arg>

        <constructor-arg>

            <list>                 

                <value>1</value>

                <!--

                <value>2</value>

                 -->

            </list>

        </constructor-arg>        

        <property name="connectionPoolSize" value="2"></property>

        <property name="commandFactory">

            <bean class="net.rubyeye.xmemcached.command.TextCommandFactory"></bean>

        </property>

        <property name="sessionLocator">

            <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>

        </property>

        <property name="transcoder">

            <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />

        </property>

    </bean>    

    <bean name="memcachedClient" factory-bean="memcachedClientBuilder"

        factory-method="build" destroy-method="shutdown" />    

    <!-- 引入Memcached客户端结束 -->    

具体在java类中使用为,以下为xmemcached的使用

package com.dsideal.demo.memcached;



import java.lang.reflect.Method;

import java.util.List;



import javax.annotation.Resource;



import net.rubyeye.xmemcached.MemcachedClient;



import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.Signature;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Pointcut;

import org.aspectj.lang.reflect.MethodSignature;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;



import com.alibaba.fastjson.JSON;

import com.dsideal.common.Cache;

import com.dsideal.common.CacheUpdate;

import com.dsideal.common.Guid;

import com.dsideal.common.MD5;

import com.dsideal.demo.bean.SysLoginPersonBean;

import com.dsideal.demo.service.ICacheLogService;



@Aspect

@Component

public class CacheAopNoMysql {

    @Autowired

    private MemcachedClient memcachedClient;

    

    //aop拦截指向

    @Pointcut("execution (* com.dsideal.demo.service.impl.*.memcache*(..))")  

    public void pointcut(){}  



    /*    

    //方法执行前调用  

    //@Before("pointcut()")  

    public void before() {  

        System.out.println("before");  //2

    }  

    */



    @Resource

    private ICacheLogService cacheLogService;  



    //方法执行的前后调用   

    @Around("pointcut()")  

    //ProceedingJoinPoint 目标类连接点对象

    public Object doAround(ProceedingJoinPoint call) throws Throwable{  

        //返回最终结果

        Object result = null;

        //定义版本号

        String prefixValue = null;

        Method[] methods = call.getTarget().getClass().getDeclaredMethods();    

        Signature signature = call.getSignature();  

        MethodSignature methodSignature = (MethodSignature) signature;    

        Method method = methodSignature.getMethod();  

        for(Method m:methods)

        {

            //循环方法,找匹配的方法进行执行  

            if(m.getName().equals(method.getName()))

            {                

                //增加,判断是不是Cache标签,如果是Cache标签,那么处理缓存的问题

                if(m.isAnnotationPresent(Cache.class))

                {  

                    Cache cache = m.getAnnotation(Cache.class);

                    //Object tempType = m.getGenericReturnType();

                    //如果memcached中存在

                    if(cache!=null)

                    {  

                        //获取注解前缀,这里为 sys,实际使用是为各个业务包名

                        String prefix = cache.prefix();  

                        //获取版本号

                        if(null != memcachedClient.get(prefix))

                        {

                            prefixValue = memcachedClient.get(prefix).toString();

                        }                        

                        else

                        {

                            prefixValue = Guid.getGuid();

                            memcachedClient.set(prefix,60*60*24*30, prefixValue);

                        }

                        

                        //获取方法名+参数类型+参数值+版本号 转 MD5

                        String key = this.getKey(method, call.getArgs(), prefixValue, prefix);  

                         

                        result =memcachedClient.get(key);  

                        if(null == result)

                        {  

                            try {  

                                //执行aop拦截的方法

                                result = call.proceed();  

                                //获取注解配置memcached死亡时间

                                int expiration = cache.expiration();

                                //利用fastjson序列化list<bean>存入memcached中

                                //具体fastjson使用方法请参考:http://www.cnblogs.com/cczhoufeng/archive/2013/04/03/2997871.html

                                if(null == prefixValue)

                                {

                                    memcachedClient.set(prefix,60*60*24*30,Guid.getGuid());

                                } 

                                memcachedClient.set(key, expiration,JSON.toJSONString(result));                                

                            } catch (Throwable e) {  

                                e.printStackTrace();  

                            }  

                        }  

                        else {

                            //如果memcached中存在结果,需要将result反序列化后返回结果

                            String memresult = result.toString();

                            //反序列化

                            List<SysLoginPersonBean> list = JSON.parseArray(memresult, SysLoginPersonBean.class);

                            result = list;

                        }



                    }  

                }

                //如果是Update标签的话,处理更新问题

                else     if(m.isAnnotationPresent(CacheUpdate.class))                    

                    {  

                        /********************************************************/

                        //如果修改操作时

                        CacheUpdate cUpdate = m.getAnnotation(CacheUpdate.class);  

                        if(cUpdate!=null)

                        {  

                            result = call.proceed();

                            String prefix = cUpdate.prefix();  

                            //获取当前版本号

                            if(null != memcachedClient.get(prefix))

                            {

                                //修改后,版本号

                                memcachedClient.replace(prefix,60*60*24*30, Guid.getGuid());

                            }

                            else

                            {

                                memcachedClient.set(prefix,60*60*24*30, Guid.getGuid());

                            }                            

                        }

                        /********************************************************/

                    }

                //找到这个方法就退出循环

                break;  

            }  

        }

        return result;

    }



    /** 

     * 组装key值 

     * @param method 

     * @param args 

     * @return 

     */  

    private String getKey(Method method, Object [] args, String prefixValue, String prefix){  

        StringBuffer sb = new StringBuffer();   

        //获取方法名

        String methodName = method.getName();

        //获取参数类型

        Object[] classTemps = method.getParameterTypes();

        //包名前缀

        sb.append(prefix+"_");

        //存入方法名

        sb.append(methodName);



        for (int i = 0; i < args.length; i++) {

            sb.append(classTemps[i]+"&");

            if (null == args[i]) {

                sb.append("null");

            } else if ("".equals(args[i])) {

                sb.append("*");

            } else {

                sb.append(args[i]);

            }

        }

        sb.append(prefixValue);

        return MD5.getMD5(sb.toString());  



    }  

}

 

你可能感兴趣的:(xmemcached)