1.緩存中的key如何設計?redis
爲了達到惟一標識的目的,key=類名+方法名+參數json
即: 目標類全名+方法名(全限定名)+參數 ------------>而後用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中app
這裏我用到的是json字符串,可是取出的時候如何解析?此處涉及到自動根據JSON字符串轉換爲對應的類型ui
JSON字符串通用解析,根據所傳入json字符串自動解析相應的類型spa
例如:集合List類型的JSON字符串解析後變爲list集合,對象User類型的JSON字符串解析爲User對象設計
要實現自動解析,就要用到JSONObject.parseObject(String text,Class<T> clazz)這個APIcode
Class<T> clazz這個參數,根據你傳入的泛型進行解析,那麼如何動態獲取當前調用方法的返回值呢???對象
以下例中的把pjp.getSignature()這個簽名轉換爲反射包中的MethodSignature,即:blog
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; }