跳至内容
技术分享
站点工具
工具
显示页面
修订记录
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
登录
搜索
您的足迹:
服务器技术:java:注解方式缓存数据_redis
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
<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>
服务器技术/java/注解方式缓存数据_redis.txt
· 最后更改: 2020/07/08 18:16 由
chenjinlian
页面工具
显示页面
修订记录
反向链接
页面重命名
回到顶部