zoukankan      html  css  js  c++  java
  • redis通用缓存设计(1)

    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; }
  • 相关阅读:
    2020-2021-1 20209307 《Linux内核原理与分析》第九周作业
    2020-2021-1 20209307 《Linux内核原理与分析》第八周作业
    2020-2021-1 20209307《Linux内核原理与分析》第七周作业
    2020-2021-1 20209307《Linux内核原理与分析》第六周作业
    2020-2021-1 20209307《Linux内核原理与分析》第五周作业
    2020-2021-1 20209307《Linux内核原理与分析》第四周作业
    2020-2021-1 20209307《Linux内核原理与分析》第三周作业
    2020-2021-1 20209307 《Linux内核原理与分析》第二周作业
    2020-2021-1 20209321《Linux内核原理与分析》第十一周作业
    2020-2021-1 Linux 《内核原理与分析》第九周作业
  • 原文地址:https://www.cnblogs.com/lkldeblog/p/11270780.html
Copyright © 2011-2022 走看看