自定义注解解耦reids缓存使用

package test.cache;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.session.SessionProperties;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import redis.RedisUtils;
import redis.clients.jedis.Jedis;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;

@Aspect
@Component
public class TestCacheAop {

    ConcurrentHashMap<String,String> lock = new ConcurrentHashMap();

    @Autowired
    RedisTemplate redisTemplate;

    @Pointcut(value="execution(public * test*.*.*.*(..))&&@annotation(TestCache)")
    public void cachePointcut() {

    }

    @Around("cachePointcut()")
    public Object around (ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        //Annotation annotation = joinPoint.getTarget().getClass().getAnnotation(TestCache.class);

        TestCache testCache = ((MethodSignature)joinPoint.getSignature()).getMethod().getAnnotation(TestCache.class);
        if(testCache  == null) {
            return null;
        }

        String key = testCache.value();
        if(key==null) {
            return null;
        }

        MethodSignature methodSignature =(MethodSignature) joinPoint.getSignature();
        Method method = joinPoint.getTarget().getClass().getMethod(methodSignature.getName(),methodSignature.getMethod().getParameterTypes());

        //java编译后的方法参数默认是不会显示参数名称的需要转换
        DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
        String[] parameters = discoverer.getParameterNames(method);

        String cacheKey = key;
        for(int i=0;i<parameters.length;i++) {
            if(parameters[i].equals(key)) {
                cacheKey = String.valueOf(joinPoint.getArgs()[i]);
                break;
            }
        }

        Object value = redisTemplate.opsForValue().get(cacheKey);
        if(value!=null) {
            return value;
        }

        //防止缓存雪崩
        String cacheFlag = lock.putIfAbsent(cacheKey,"true");

        Object obj = null;
        if(cacheFlag == null) {
            try {
                obj = joinPoint.proceed();
                redisTemplate.opsForValue().set(cacheKey,obj);
            } catch(Throwable throwable) {
                throwable.printStackTrace();
            }
            return obj;
        }else {
            return "当前系统忙";
        }
    }

}

原文地址:https://www.cnblogs.com/long757747969/p/10805685.html

时间: 2024-10-21 08:58:56

自定义注解解耦reids缓存使用的相关文章

基于 自定义注解 和 aop 实现使用memcache 对数据库的缓存 示例

好久没更新blog了,在新公司打拼了两个月,每天都从早忙到晚,学到了很多东西,但是没有时间来更新blog了.... 下面开始讲解这次的主题 公司老大让我研究 ocs 就是阿里云的 开放缓存服务 点击打开链接 其实就是一个memcache的服务 memchech 就是用内存来存放 key -value  在一些情况下就不必频繁的访问 数据库了(其实就是个map) 如何在常用的Dao中方便的使用这个map呢,我首先想到了 aop,然后又想到了自定义注解,那么就开始干吧.... aop动态代理要使用的

Spring AOP+自定义注解实现缓存

Spring AOP配置: <aop:config> <aop:aspect ref="cacheAdvice"> <aop:pointcut id="cachePointcut" expression="execution(* cn.vobile.service..*.*(..)) and @annotation(cacheable)"/> <aop:around method="cacheD

SpringMVC拦截器+Spring自定义注解实现权限验证

设计思路 主要针对需要登录后操作的接口进行校验.接入层在对外暴露接口后,网页.APP.第三方等等途径进行访问接口.用户请求首先会被SpringMVC拦截器拦截到,在拦截器里第一步就是需要校验用户的登录身份(由于是分布式系统这里采用的是userId+accessToken方式来校验),登录校验通过之后再进行用户权限校验,此时会自动拦截@AuthValidate注解的method(核心),如果权限校验失败则抛出权限不足异常,否则校验通过之后再执行具体接口并返回结果. 1.自定义注解 1 packag

结合spring 实现自定义注解

注解类 import java.lang.annotation.*; /** * Created by Administrator on 2016/6/28. */ //ElementType.METHOD 在方法上使用 @Target(ElementType.METHOD) //范围 @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Cacheable { String key(); String fieldKe

springmvc 下使用自定义注解获取登录信息

大家的项目中在controller层是怎样获取登录用户的信息呢? User loginUser=LoginUtil.getLoginUser(); 我想有些同学是通过这样获得的,如果这样实现的话, 恭喜你,你的Controller层已经丧失了单元测试的能力. 因为执行这个controller所需要的参数并没有完全通过参数列表来获得,而依赖于全局环境(web环境) 如果这样做使得springmvc为环境解耦所设计的整个架构变得毫无意义. 那怎么样写才算是高大上呢?先贴出最后效果 @RequestM

Android中的自定义注解

转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51779695 本文出自:[顾林海的博客] 前言 目前注解的使用频率还是挺高,像第三方butterknife.数据库ActiveAndroid等等,通过注解,我们的开发效率得到了明显提高.因此理解注解并熟练使用注解是非常重要的,下面分为两部分,第一部分是注解的介绍,资料来源于网上;第二部分是两个小例子,利用注解+反射分别完成网络请求的封装和数据库操作案例. 什么是注解

【面试加分项】java自定义注解之解析注解

我之前的博客中说明过自定义注解的声明今天我们来看看如何对我们自己定义的注解进行使用. 1.我们在程序中使用我们的注解. 上一篇中我们自定义了一个注解: @Target(ElementType.FIELD)//注解的作用范围,就是注解是用在什么地方的 @Retention(RetentionPolicy.RUNTIME)//注解的级别,就是注解能留存到什么时候 @Documented @Inherited public @interface MyAnnotation { public String

ssm+redis整合(通过aop自定义注解方式)

此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementTyp

通过自定义注解与aop统一存储操作记录

模块开发完成后,接到通知需要添加操作记录功能,看着那一堆接口,如果一个方法一个方法的加,那真是太麻烦了.为了偷懒,就百度了一下,发现可以通过自定义注解和aop的形式来统一添加操作记录,只需要在每个方法上面添加自定义的注解就可以了.我在这里用的是springboot2.0以及jpa,废话不多说,直接上代码~ 自定义注解serverLog import java.lang.annotation.ElementType; import java.lang.annotation.Retention; i