站点工具


服务器技术:java:注解方式缓存数据_redis

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

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