|
服务器技术:java:注解方式缓存数据_redis [2020/07/08 18:16] chenjinlian 创建 |
服务器技术:java:注解方式缓存数据_redis [2020/07/08 18:16] (当前版本) chenjinlian |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | <p>/**<br/> * 元注解 用来标识查询数据库的方法<br/> */<br/>@Documented<br/>@Target(ElementType.METHOD)<br/>@Retention(RetentionPolicy.RUNTIME)<br/>public @interface UseRedisCache {<br/><br/>    /**<br/>   * 缓存超时时间控制,> 0 则做超时控制<br/>   * @return<br/>   */<br/>    int expireSeconds() default -1;<br/>}</p><p><br/></p><p><br/>import java.lang.reflect.Method;<br/>import org.aspectj.lang.ProceedingJoinPoint;<br/>import org.aspectj.lang.annotation.Around;<br/>import org.aspectj.lang.annotation.Aspect;<br/>import org.aspectj.lang.annotation.Pointcut;<br/>import org.slf4j.Logger;<br/>import org.slf4j.LoggerFactory;<br/>import org.springframework.beans.factory.annotation.Autowired;<br/>import org.springframework.stereotype.Component;<br/><br/>import cn.com.amway.app.client.RedisClient;<br/>import cn.com.amway.app.configuration.ConfTable;<br/>import cn.com.amway.framework.annotation.UseRedisCache;<br/><br/>/**<br/> * AOP实现Redis缓存处理<br/> * <br/> * @decr<br/> * @author jlchent<br/> * @date 2018年7月18日<br/> *<br/> */<br/>@Component<br/>@Aspect<br/>public class RedisAspect {<br/><br/>    private static final Logger logger = LoggerFactory.getLogger(RedisAspect.class);<br/><br/>    @Autowired<br/>    private RedisClient redisCache;<br/><br/>    <br/><br/>    /**<br/>   * 拦截所有元注解RedisCache注解的方法<br/>   */<br/>    @Pointcut("@annotation(cn.com.framework.annotation.UseRedisCache)")<br/>    public void pointcutMethod() {<br/><br/>    }<br/><br/>    /**<br/>   * 环绕处理,先从Redis里获取缓存,查询不到,就通过method查询, 然后再保存到Redis缓存里<br/>   * <br/>   * @param joinPoint<br/>   * @return<br/>   * @throws Throwable<br/>   */<br/>    @Around("pointcutMethod()")<br/>    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {<br/>        // 前置:从Redis里获取缓存<br/>        // 先获取目标方法参数<br/>        long startTime = System.currentTimeMillis();<br/>        Object[] args = joinPoint.getArgs();<br/>        String pragrm = "";<br/>        if (args != null && args.length > 0) {<br/>            for (int i = 0; i < args.length; i++) {<br/>                pragrm = "_"+pragrm + String.valueOf(args[i]) ;<br/>            }<br/>        }<br/>        // 获取目标方法所在类<br/>        String target = joinPoint.getTarget().toString();<br/>        String className = target.split("@")[0];<br/>        // 获取目标方法的方法名称<br/>        String methodName = joinPoint.getSignature().getName();<br/>        int expireSeconds = 0;<br/>            <br/>        Class<?> returnType = Object.class;<br/>        <br/>        try {<br/>            Class<?> clz = Class.forName(className);<br/>            Class<?>[] classes = null;<br/>            if (args != null && args.length > 0) {<br/>                classes = new Class[args.length];<br/>                for (int i = 0; i < classes.length; i++) {<br/>                    classes[i] = args[i].getClass();<br/>                }<br/>            }<br/><br/>            Method method = clz.getMethod(methodName, classes);<br/>            <br/>            returnType = method.getReturnType();<br/>            <br/>            UseRedisCache useRedisCache = method.getAnnotation(UseRedisCache.class);<br/><br/>            if (useRedisCache != null && useRedisCache.expireSeconds() > 0) {<br/>                expireSeconds = useRedisCache.expireSeconds();<br/>            }<br/><br/>       } catch (ClassNotFoundException e1) {<br/>            // TODO Auto-generated catch block<br/>            e1.printStackTrace();<br/>            logger.warn("类包"+className+"不存在", e1);<br/>            throw e1;<br/>        }<br/><br/>        // redis中key格式: applId:方法名称<br/>        String redisKey = ConfTable.REDIS_ASPECT_PREFIX + className + "." + methodName + pragrm;<br/><br/>        Object obj = (Object)redisCache.getObjFromRedis(redisKey, returnType);<br/><br/>        if (obj != null) {<br/>            logger.info("**********从Redis中查到了数据**********");<br/>            logger.info("Redis的KEY值:" + redisKey);<br/>            logger.info("REDIS的VALUE值类型:" + obj.getClass().getName());<br/>            return obj;<br/>        }<br/>        long endTime = System.currentTimeMillis();<br/>        logger.info("Redis缓存AOP处理所用时间(毫秒):" + (endTime - startTime));<br/>        logger.info("**********没有从Redis查到数据**********");<br/><br/>        logger.info("**********开始通过Method查询数据**********");<br/>        obj = joinPoint.proceed();<br/>        <br/>        if (obj == null) {<br/>            logger.info("**********获取到null数据**********");<br/>            return null;<br/>        }<br/>        <br/>        // 后置:将数据库查到的数据保存到Redis<br/>        String code = "";<br/>        if (expireSeconds > 0) {<br/>            code = redisCache.saveObjToRedis(redisKey, obj, expireSeconds);<br/>       } else {<br/>            code = redisCache.saveObjToRedis(redisKey, obj);<br/>        }<br/>        if (("OK").equals(code)) {<br/>            logger.info("**********数据成功保存到Redis缓存!!!**********");<br/>            logger.info("Redis的KEY值:" + redisKey);<br/>            logger.info("REDIS的VALUE值类型:" + obj.getClass().getName());<br/>        }<br/>        return obj;<br/>    }<br/><br/>}<br/></p> | ||