• redis应用于微服务缓存的探讨


    最近在做一个类似于教师家访的管理系统,使用的技术架构是SpringCloud,业务架构如下图:

     在common共用模块中,有抽取出来的util工具类,用于管理缓存,例如用户缓存工具类UserUtils(存储用户id作为key及用户对象作为value),项目缓存工具类ProjectUtils(存储项目id作为key及项目对象作为value),角色的缓存工具类RoleUtils,分组工具类GroupUtils,表单工具类FormUtils以及问题工具类QuestionUtils等,用来提高查询效率。

    但是在查询时,采取的是如果查询不到直接返回空,代码如下:

    1. /**
    2. * 获取项目名称
    3. *
    4. * @return
    5. */
    6. public static String getProjectName(String key) {
    7. Object cacheObj = SpringUtils.getBean(RedisService.class).getCacheMapValue(getCacheKey(), key);
    8. if (StringUtils.isNotNull(cacheObj)) {
    9. String result = StringUtils.cast(cacheObj);
    10. return result.split(",")[1];
    11. }
    12. return null;
    13. }

    此时,如果缓存系统因为淘汰策略淘汰了一些数据,那么生产环境可能会出现事故,所以我们讨论了一下,做了如下包装类:

    1. public <T> T getName(Long id, String str) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException,
    2. IllegalAccessException {
    3. QueryNameForCacheEnum enumByCode = QueryNameForCacheEnum.getEnumByCode(str);
    4. if (Objects.isNull(enumByCode)) {
    5. return null;
    6. }
    7. Class clazz = Class.forName(enumByCode.getClassName());
    8. Method method = clazz.getMethod(enumByCode.getMethodName(), String.class);
    9. T res = (T) method.invoke(null, String.valueOf(id));
    10. if (Objects.isNull(res)) {
    11. Object remoteObj;
    12. switch (enumByCode.getRemoteClass()) {
    13. case "remoteProjectService":
    14. remoteObj = remoteProjectService;
    15. break;
    16. case "remoteRoleService":
    17. remoteObj = remoteRoleService;
    18. break;
    19. case "remoteUserService":
    20. remoteObj = remoteUserService;
    21. break;
    22. default:
    23. throw new IllegalStateException("Unexpected value");
    24. }
    25. Class<?> remoteClazz = remoteObj.getClass();
    26. Method remoteMethod = remoteClazz.getMethod(enumByCode.getRemoteMethod(), Long.class, String.class);
    27. remoteMethod.invoke(remoteObj, new Object[]{id, SecurityConstants.INNER});
    28. res = (T) method.invoke(null, String.valueOf(id));
    29. }
    30. return res;
    31. }
    其中枚举类QueryNameForCacheEnum代码如下:
    1. FROM("form","com.xxx.FormUtils","getFormName","remoteProjectService","setCacheByFormId"),
    2. GROUP("group","com.xxx.GroupUtils","getGroupName","remoteProjectService","setCacheByGroupId"),
    3. PROJECT("project","com.xxx.ProjectUtils","getProjectName","remoteProjectService","setCacheByGroupId"),
    4. ROLE("role","com.xxx..RoleUtils","getRoleName","remoteRoleService","setCacheByRoleId"),
    5. USER("user","com.xxx.UserUtils","getUserName","remoteUserService","setCacheByUserId"),
    做了一个包装,如果调用缓存为空,则调用相关远程类查询一下数据库再进行返回。
    
  • 相关阅读:
    python商城
    【C++编程语言】之面向对象的三大特性之一封装
    Nmap 常用命令汇总
    Java进阶学习笔记31——日期时间
    替换SlowFast中Detectron2为Yolov8
    基于Springboot的地方美食分享网站(有报告)。Javaee项目,springboot项目。
    MySQL索引与事务
    IDEA2022版通过Git传递代码到Gitee(码云)上
    算法通关村第19关【黄金】| 继续盘点高频动态规划dp问题
    VMware Horizon 8 运维系列(二)win10设置共享桌面图标
  • 原文地址:https://blog.csdn.net/guojing1173132123/article/details/125483664