码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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"),
    做了一个包装,如果调用缓存为空,则调用相关远程类查询一下数据库再进行返回。
    
  • 相关阅读:
    含文档+PPT+源码等]精品微信小程序在线考试系统+后台管理系统|前后分离VUE[包运行成功]微信小程序毕业设计项目源码计算机毕设
    猿创征文 |【算法入门必刷】数据结构-栈(四)
    金仓数据库KingbaseES Clusterware配置手册(集群搭建前置操作 )
    痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(7)- 从SD/eMMC启动
    使用python开发二维码识别功能、Docker镜像安装opencv-contrib-python、
    Linux下启动jar包的几种常见方式
    电源车3d虚拟元宇宙展厅方便用户随时看车买车
    记录一次阿里云服务器ECS上启动的portainer无法访问的问题
    设计模式(上)
    uni-app的优缺点;uniapp进行条件编译的两种方法;小程序端和H5的代表值
  • 原文地址:https://blog.csdn.net/guojing1173132123/article/details/125483664
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号