redis通用緩存設計(1)

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字符串,可是取出的時候如何解析?此處涉及到自動根據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; }
相關文章
相關標籤/搜索