• 注解+AOP实现redis遍历缓存


    1.注解

    package com.yun.smart.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import java.util.concurrent.TimeUnit;
    
    @Target(ElementType.METHOD)  
    @Retention(RetentionPolicy.RUNTIME)  
    public @interface CacheAnnotation {
    
    	 /**
         * 缓存key值
         * @return
         */
        String key();
         
        /**
         * 缓存时长
         * @return
         */
        long timeToLive();
        
        /**
         * 对象类型
         * @return
         */
        Class<?> clazz();
         
        /**
         * 缓存时长单位,默认分
         * @return
         */
        TimeUnit timeUnit() default TimeUnit.MINUTES;
        
    }
    

      

    2.AOP

    package com.yun.smart.aspect;
    
    import java.util.concurrent.TimeUnit;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import com.yun.smart.annotation.CacheAnnotation;
    import com.yun.smart.redis.RedisService;
    
    @Component
    @Aspect
    public class CacheAspect {
    
    	private static Logger LOGGER = LoggerFactory.getLogger(CacheAspect.class);
    	 
    	@Autowired
    	private RedisService redisService;
         
        @Around("within(com.yun.smart.cache.service.*) && @annotation(cacheAnnotation)")
        public Object doAround(ProceedingJoinPoint pJoinPoint, CacheAnnotation cacheAnnotation) throws Throwable {
            String key = cacheAnnotation.key();
            TimeUnit timeUnit = cacheAnnotation.timeUnit();
            long timeToLive = cacheAnnotation.timeToLive();
            Class<?> clazz = cacheAnnotation.clazz();
            
            //获取参数
            Object[] args = pJoinPoint.getArgs();
            if (args[0] == null) return null;
             
            key = key.concat(args[0].toString());
            Object obj = redisService.get(key, clazz);
            
            if (obj == null) {
                Object result = pJoinPoint.proceed();
                if (result == null) {
                    LOGGER.warn("[{}]无命中。", key);
                    return null;
                }
                
                redisService.put(key, result, timeToLive, timeUnit);
                LOGGER.debug("从数据库命中:{}", result);
                return result;
            } else {
                LOGGER.debug("从缓存命中:{}", obj);
                return obj;
            }
             
        }
    
        
    }
    

      

     3.使用

    /**
    	 * 根据openId查询用户信息
    	 * @param openId
    	 * @return
    	 */
    	@CacheAnnotation(key=CacheConstant.USER, clazz=UserInfo.class, timeToLive=24, timeUnit=TimeUnit.HOURS)
    	public UserInfo getUserInfoById(Long userInfoId) {
    		return userInfoService.selectById(userInfoId);
    	}
    

      

  • 相关阅读:
    Maven工程无异常 启动没有出现Starting ProtocolHandler的原因
    Unknown return value type [java.lang.Boolean]] with root cause
    解决java.lang.IllegalArgumentException: No converter found for return value of type
    jsp页面的地址
    HTTP Status 500
    Could not resolve placeholder 'IMAGE_SERVER_URL' in string value "${IMAGE_SERVER_URL}"
    yum出现Loaded plugins: fastestmirror, security Loading mirror speeds from cached hostfile解决方法
    【程序人生】百度员工应聘腾讯职位,结果亮了!
    【开源组件】FastDFS集群搭建与实战
    【开源组件】FastDFS极速入门与安装
  • 原文地址:https://www.cnblogs.com/yun965861480/p/11314315.html
Copyright © 2020-2023  润新知