1.缓存中的key如何设计?

为了达到唯一标识的目的,key=类名+方法名+参数

即:    目标类全名+方法名(全限定名)+参数     ------------>然后用MD5转换一下

//生成key
    public static String getKey(ProceedingJoinPoint pjp){
        StringBuilder stringBuilder = new StringBuilder();
        //目标类全名
        String clazzName = pjp.getTarget().getClass().getName();
        //方法名
        String MethodName = pjp.getSignature().getName();
        stringBuilder.append(clazzName).append(MethodName);
        //参数
        Object[] parameters = pjp.getArgs();
        for (Object parameter : parameters) {
            stringBuilder.append(parameter);
        }
        //对拼接的key的值做MD5
        return DigestUtils.md5DigestAsHex(stringBuilder.toString().getBytes());
    }

2.数据以何种方式存入redis

  •  对象序列化,在取值时,利用对象反序列化
  • json字符串

这里我用到的是json字符串,但是取出的时候如何解析?此处涉及到自动根据JSON字符串转换为对应的类型

 

JSON字符串通用解析,根据所传入json字符串自动解析相应的类型

例如:集合List类型的JSON字符串解析后变为list集合,对象User类型的JSON字符串解析为User对象

要实现自动解析,就要用到JSONObject.parseObject(String text,Class<T> clazz)这个API

Class<T> clazz这个参数,根据你传入的泛型进行解析,那么如何动态获取当前调用方法的返回值呢???

如下例中的把pjp.getSignature()这个签名转换为反射包中的MethodSignature,即:

MethodSignature signature = (MethodSignature) pjp.getSignature();
然后利用
signature.getReturnType()获取当前方法调用的返回值类型
//开发环绕通知
    @Around("within(com.lkl.service.*ServiceImpl)")
    public Object around(ProceedingJoinPoint pjp){
        //获取key
        String key = getKey(pjp);
        //获取jedis对象,以默认端口号6379连接
        Jedis jedis = new Jedis("192.168.1.*",6379);
        Object result = null;
        //判断Redis中是否存在这个key
        if(jedis.exists(key)){//如果存在取出数据返回
            System.out.println("the data is exist in redis,direct return ");
            String json = jedis.get(key);
       //把这个签名转换为反射包中的MethodSignature MethodSignature signature
= (MethodSignature) pjp.getSignature(); System.out.println(signature.getReturnType()); result = JSONObject.parseObject(json,signature.getReturnType()); }else{ //如果不存在,放行,Dao方法执行存入Redis中 System.out.println("the data is not exist in redis,query the DB"); try { result = pjp.proceed();//放行 //放入redis中,以json形式存入 jedis.set(key,JSONObject.toJSONString(result)); } catch (Throwable throwable) { throwable.printStackTrace(); } } return result; }