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; }
  • 相关阅读:
    elasticsearch 中的Multi Match Query
    activiti 流程部署的各种方式
    elasticsearch 嵌套对象之嵌套类型
    elasticsearch Java High Level REST 相关操作封装
    elasticsearch 字段数据类型
    ubuntu 安装 docker
    elasticsearch 通过HTTP RESTful API 操作数据
    facenet 人脸识别(二)——创建人脸库搭建人脸识别系统
    POJ 3093 Margaritas(Kind of wine) on the River Walk (背包方案统计)
    墨卡托投影, GPS 坐标转像素, GPS 坐标转距离
  • 原文地址:https://www.cnblogs.com/lkldeblog/p/11270780.html
Copyright © 2011-2022 走看看