|
java:注解方式缓存数据_jvm [2020/07/08 18:15] chenjinlian 创建 |
java:注解方式缓存数据_jvm [2020/07/08 18:17] (当前版本) chenjinlian |
||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | <p>import java.lang.annotation.*;<br/><br/>/**<br/> * 元注解 用来标识查询数据库的方法<br/> */<br/>@Documented<br/>@Target(ElementType.METHOD)<br/>@Retention(RetentionPolicy.RUNTIME)<br/>public @interface UseMemCache {<br/><br/>    /**<br/>   * 缓存超时时间控制,> 0 则做超时控制<br/>   * @return<br/>   */<br/>    int expireSeconds() default 30;<br/>}</p><p>=================================================</p><p><br/></p><p><br/></p><p><br/></p><p><br/></p><p><br/></p><p><br/>/**<br/> * AOP实现cache缓存处理(缓存到静态对象)<br/> * <br/> * @decr<br/> * @author jlchent<br/> * @date 2018年11月03日<br/> *<br/> */<br/>@Component<br/>@Aspect<br/>public class MemCacheAspect {<br/><br/>    private static final Logger logger = LoggerFactory.getLogger(MemCacheAspect.class);<br/><br/>    /**<br/>   * 数据缓存<br/>   */<br/>    private  static Hashtable<String, Object> dataTable = new Hashtable<>();<br/>    <br/>    /**<br/>   * 超时控制<br/>   */<br/>    private  static Hashtable<String, Long> timeoutTable = new Hashtable<>();<br/><br/>    <br/><br/>    /**<br/>   * 拦截所有元注解cacheCache注解的方法<br/>   */<br/>    @Pointcut("@annotation(cn.com.framework.annotation.UseMemCache)")<br/>    public void pointcutMethod() {<br/>    }<br/><br/>    <br/>    private String saveObjToMem(String cacheKey, Object obj, int expireSeconds){<br/>        dataTable.put(cacheKey, obj);<br/><br/>        Long expireTime = System.currentTimeMillis() + expireSeconds*1000;<br/>        timeoutTable.put(cacheKey, expireTime);<br/>        <br/>        return "OK";<br/>    }<br/>    <br/>    private String saveObjToMem(String cacheKey, Object obj){<br/>        dataTable.put(cacheKey, obj);<br/>        return "OK";<br/>    }<br/>    <br/>    private Object getObjFromMem(String cacheKey) {<br/>        Long expireTime = timeoutTable.get(cacheKey);<br/>        Long currentTime = System.currentTimeMillis();<br/>        if (null != expireTime && currentTime > expireTime) {<br/>            //过期清空<br/>            dataTable.remove(cacheKey);<br/>            timeoutTable.remove(cacheKey);<br/>            return null;<br/>        }else<br/>        return dataTable.get(cacheKey);<br/>    }<br/>    <br/>    <br/>    /**<br/>   * 环绕处理,先从cache里获取缓存,查询不到,就通过method查询, 然后再保存到cache缓存里<br/>   * <br/>   * @param joinPoint<br/>   * @return<br/>   * @throws Throwable<br/>   */<br/>    @Around("pointcutMethod()")<br/>    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {<br/>        // 前置:从cache里获取缓存<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/>        <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/>            <br/>            UseMemCache useMemCache = method.getAnnotation(UseMemCache.class);<br/><br/>            if (useMemCache != null && useMemCache.expireSeconds() > 0) {<br/>                expireSeconds = useMemCache.expireSeconds();<br/>            }<br/><br/>       } catch (ClassNotFoundException e1) {<br/>            e1.printStackTrace();<br/>            logger.warn("类包"+className+"不存在", e1);<br/>            throw e1;<br/>        }<br/><br/>        // cache中key格式: applId:方法名称<br/>        String cacheKey = className + "." + methodName + pragrm;<br/><br/>        Object obj = getObjFromMem(cacheKey);<br/>        <br/>        <br/>        if (obj != null) {<br/>        <br/>            logger.debug("cache的VALUE值类型:" + obj.getClass().getName());<br/>            return obj;<br/>        }<br/>        long endTime = System.currentTimeMillis();<br/>        logger.debug("cache缓存AOP处理所用时间(毫秒):" + (endTime - startTime));<br/>        logger.info("**********没有从cache查到数据**********");<br/><br/>        logger.info("**********开始通过Method查询数据**********");<br/>        obj = joinPoint.proceed();<br/>        <br/>        if (obj == null) {<br/>            logger.info("**********获取到null数据**********");<br/>            return null;<br/>        }<br/>        <br/>        // 后置:将数据库查到的数据保存到cache<br/>        String code = "";<br/>        if (expireSeconds > 0) {<br/>            code = saveObjToMem(cacheKey, obj, expireSeconds);<br/>       } else {<br/>            code = saveObjToMem(cacheKey, obj);<br/>        }<br/>        if (("OK").equals(code)) {<br/>            logger.info("**********数据成功保存到cache缓存!!!**********");<br/>            logger.info("MeM的KEY值:" + cacheKey);<br/>            logger.info("cache的VALUE值类型:" + obj.getClass().getName());<br/>        }<br/>        return obj;<br/>    }<br/><br/>}</p> | ||