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; }