gtlib 发表于 2015-7-23 07:49:58

redis缓存相关

  import com.meiliwan.emall.commons.jedisTool.JedisKey;
  import java.lang.annotation.*;
  @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Inherited
public @interface HelloWorld {
   public JedisKey key();
}
  
  package com.meiliwan.emall.pms.util;
  
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.meiliwan.emall.commons.jedisTool.JedisKey;
import com.meiliwan.emall.commons.jedisTool.ShardJedisTool;
import com.meiliwan.emall.commons.util.StringUtil;
import com.meiliwan.emall.icetool.JSONTool;
import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
  import java.io.Serializable;
import java.lang.reflect.Method;
  import static com.meiliwan.emall.icetool.JSONTool.addToResult;
  
@Aspect
@Component
public class HelloWorldAspect {
  private final Logger logger = LoggerFactory.getLogger(this.getClass());
  @Pointcut("execution(* com.meiliwan.emall.*.service..*Service.*(..)) && @annotation(com.meiliwan.emall.pms.util.HelloWorld)")
    public void helloWorldAnnotated() {}
  @Before("helloWorldAnnotated()")
    public void before(JoinPoint jp) throws Throwable{
      logger.debug("==============================before: "
                + jp.getSignature());
  
    }
  @Around("helloWorldAnnotated()")
    public void around(ProceedingJoinPoint pjp) throws Throwable{
      logger.debug("==============================@Around.before");
  //获取方法名称
      String methodName = pjp.getSignature().getName();
      if (StringUtils.isNotEmpty(methodName)){
            //获取目标类名
            Class targetClass = pjp.getTarget().getClass();
  Method[] methods = targetClass.getDeclaredMethods();
            if (methods != null){
                Method mt = null;
                //循环匹配对应的查找方法
                for(Method method : methods){
                  if(method == null)continue;
                  if(method.getName().equals(methodName)){
                        mt = method;
                        break;
                  }
                }
                if (mt!=null){
                  boolean hasAnnotation = mt.isAnnotationPresent(HelloWorld.class);
                  if (hasAnnotation){
                        HelloWorld annotations =mt.getAnnotation(HelloWorld.class);
                        JedisKey key = annotations.key();
                        if (key!=null&&!key.equals("")){
                            //获取方法参数
                            Object[] args = pjp.getArgs();
                            JsonObject resultObj = (JsonObject)args;
                            Object redidId = args;
                            //加一个异常捕获,用于特殊情况,如果缓存宕机或者链接超时等
                            try {
                            //查缓存
                              String obj = ShardJedisTool.getVolatile().get(key, (Serializable) redidId);
                              if(obj!=null&&!obj.equals("")){
                                    JsonObject redisObj = (JsonObject)(new JsonParser().parse(obj));
                                    addToResult(redisObj.get("resultObj").getAsJsonObject(),resultObj);
                              } else{
                                    //走数据库查询
                                    pjp.proceed();
                                    //缓存到缓存中
                                    ShardJedisTool.getVolatile().set(key, (Serializable) redidId, resultObj);
                              }
                            }catch (Exception e){
                              logger.debug("========缓存宕机或者链接超时等=======");
                              pjp.proceed();
                            }
                        }
                  }
                }
            }
      }
  logger.debug("==============================@Around.after");
  }
  @After("helloWorldAnnotated()")
    public void after(JoinPoint joinPoint) {
      logger.debug("==============================after: "
                + joinPoint.getSignature());
  }
}
页: [1]
查看完整版本: redis缓存相关