当前位置: 首页 > article >正文

资源管理模块集成Spring Cache

一、需求分析

 在智慧养老项目中,资源管理模块需要高效地处理资源的查询、添加、修改和删除操作。随着用户量的增加,频繁的数据库访问可能会带来较高的性能开销。因此,使用 Redis 实现缓存优化是一个有效的解决方案。

Spring Cache 简介

Spring Cache 是 Spring 提供的缓存抽象框架,它通过注解的方式简化了缓存的使用,支持多种缓存实现(如 Redis、Ehcache 等)。主要功能包括:

  1. @Cacheable在方法执行前先查询缓存中是否有数据,如果有数据,则直接返回缓存数据;如果没有缓存数据,调用方法并将方法返回值放到缓存中

  2. @CacheEvict:用于清除缓存,保证缓存数据的实时性。

  3. @Caching:支持组合多种缓存操作。

  4. @CachePut:更新缓存但不影响方法的实际调用。

通过与 Redis 集成,Spring Cache 可以实现高效、灵活的分布式缓存管理。

具体需求包括:

  1. 资源列表和树形结构的缓存:减少查询数据库的频率,提高响应速度。

  2. 添加、修改和删除资源时清除相关缓存:保证缓存数据的实时性和一致性。

  3. 支持多条件查询:针对不同的查询需求,使用缓存存储对应的数据。

解决方案采用了 Spring Cache 结合 Redis 的方式,在保证缓存性能的同时简化了开发流程。

二、代码解读

以下对核心代码进行详细解读,特别是 Redis 缓存相关的技术和注解。

1. 查询资源列表并添加缓存

@Cacheable(cacheNames = CacheConstants.LIST, key = "#resourceDto.hashCode()")
@Override
public List<ResourceVo> getList(ResourceDto resourceDto) {
    List<Resource> resources = resourceMapper.selectList(resourceDto);
    return BeanUtil.copyToList(resources, ResourceVo.class);
}
详细解读:
  • @Cacheable

    • cacheNames:指定缓存的名称,此处为 CacheConstants.LIST,用于标识资源列表缓存。

    • key:缓存的键值,这里使用 #resourceDto.hashCode() 确保不同查询条件对应不同的缓存数据。

  • 逻辑说明

    1. 方法首次调用时,Spring Cache 会执行 getList 方法查询数据库,并将返回结果存入 Redis。

    2. 再次调用相同条件时,直接从 Redis 中读取缓存数据,无需访问数据库。

2. 封装资源的树形结构并添加缓存

@Cacheable(cacheNames = CacheConstants.TREE)
@Override
public TreeVo resourceTreeVo(ResourceDto resourceDto) {
    ResourceDto dto = ResourceDto.builder()
        .parentResourceNo(NoProcessing.processString(SuperConstant.ROOT_PARENT_ID))
        .resourceType(SuperConstant.MENU)
        .dataState(SuperConstant.DATA_STATE_0)
        .build();
    List<Resource> resources = resourceMapper.selectList(dto);
    List<TreeItemVo> itemVos = new ArrayList<>();
    Resource root = new Resource();
    root.setResourceNo(SuperConstant.ROOT_PARENT_ID);
    root.setResourceName("智慧养老院");
    recursionTreeItem(itemVos, root, resources);
    return TreeVo.builder().items(itemVos).build();
}
详细解读:
  • @Cacheable:将方法返回的树形结构缓存到 Redis 中,cacheNamesCacheConstants.TREE

  • 递归封装树形结构

    • 方法 recursionTreeItem 通过递归构建树形数据。

    • 数据仅从数据库中查询一次,后续操作基于内存处理,大大减少了数据库访问。

  • 性能优势:树形结构的构建通常需要多次查询数据库,缓存可以显著减少查询次数,提高响应速度。

3. 添加资源并清除缓存

@Caching(evict = {
    @CacheEvict(cacheNames = CacheConstants.LIST, allEntries = true),
    @CacheEvict(cacheNames = CacheConstants.TREE, allEntries = true)
})
@Override
public void createResource(ResourceDto resourceDto) {
    Resource resource = BeanUtil.toBean(resourceDto, Resource.class);
    Resource parenResource = resourceMapper.selectByResourceNo(resourceDto.getParentResourceNo());
    resource.setDataState(parenResource.getDataState());
    String resourceNo = createResourceNo(resourceDto.getParentResourceNo(), true);
    resource.setResourceNo(resourceNo);
    resourceMapper.insert(resource);
}
详细解读:
  • @Caching:组合多个缓存操作。

    • @CacheEvict:用于清除缓存。

      • cacheNames:指定需要清除的缓存名称。

      • allEntries = true:清除对应缓存的所有数据。

  • 逻辑说明

    1. 添加资源后,资源列表和树形结构的缓存会被清除。

    2. 下次查询时会重新调用数据库查询方法,确保数据一致性。

4. 修改和删除资源的缓存清理

  • 修改和删除操作同样使用 @CacheEvict 清理相关缓存,确保缓存数据与数据库同步。

  • 一致性保障:对数据的任何修改都会触发缓存清理机制,避免返回过期数据。

三、总结

通过将 Redis 集成到资源管理模块,利用 Spring Cache 实现了高效的缓存管理:

  1. 显著提高了查询性能:资源列表和树形结构查询时,优先从缓存读取数据,减少数据库访问。

  2. 确保缓存数据的一致性:在资源添加、修改和删除操作后,通过缓存清理机制保持缓存与数据库同步。

  3. 开发效率提升:Spring Cache 的注解式开发使缓存管理更加简单易用。


http://www.kler.cn/a/511493.html

相关文章:

  • 有限元分析学习——Anasys Workbanch第一阶段笔记(13)网格单元分类、物理场与自由度概念
  • 当PHP遇上区块链:一场奇妙的技术之旅
  • CMD批处理命令入门(6)——常用的特殊字符
  • HarmonyOS应用开发-低代码开发登录页面(超详细)
  • 流量分析复现(第十八届信息安全大赛 第二届长城杯 )
  • 庄小焱——2024年博文总结与展望
  • 【Linux系统编程】—— 深度解析进程等待与终止:系统高效运行的关键
  • TCP状态转移图详解
  • 【数据结构-堆】【hard】力扣502. IPO
  • 【opencv】第10章 角点检测
  • Kinova仿生机械臂Gen3搭载BOTA 力矩传感器SeneOne:彰显机器人触觉 AI 与六维力传感的融合力量
  • StarRocks 怎么让特定的SQL路由到FE master节点的
  • 推荐sdkman管理sdk和jdk
  • Java 基于 SpringBoot+Vue 的停车场管理系统(附源码,部署,文档)
  • 神经网络常见面试题
  • MySQL 主从复制原理及其工作过程的配置
  • Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批、流程挂起和激活、任务分配
  • 本地部署 Calcium 网页计算器并实现外部访问
  • MySQL数据库的数据文件保存在哪?MySQL数据存在哪里
  • efficient_pcm 函数
  • vue3+echarts+DataV实现省市县地图
  • 使用插件时的注意事项
  • 【Bluedroid】HFP连接流程源码分析(四)
  • Java中json的一点理解
  • 数据库管理语句分类
  • YOLOv10-1.1部分代码阅读笔记-utils.py