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

Spring Cache 整合 Redis 实现高效缓存

介绍

Spring Cache 是 Spring 框架提供的缓存抽象层,它简化了在应用中添加缓存功能的过程,允许开发者通过注解方式轻松实现缓存逻辑,而无需关注具体的缓存实现细节。

  1. 缓存抽象:Spring Cache 不直接提供缓存实现,而是定义了一套接口(如 CacheCacheManager),支持多种缓存实现(如 Caffeine、EhCache、Redis 等)。
  2. 注解驱动:通过注解(如 @Cacheable@CachePut@CacheEvict)声明缓存规则,无需手动编写缓存逻辑。
  3. 透明集成:缓存操作与业务逻辑解耦,开发者只需关注业务代码。

常用注解

在这里插入图片描述

  1. @Cacheable
    标记方法结果可被缓存。调用方法时,先检查缓存:

    • 若缓存存在,直接返回缓存值,不执行方法。
    • 若缓存不存在,执行方法并将结果存入缓存。
    @Cacheable(value = "users", key = "#id")
    public User getUserById(Long id) {// 从数据库查询用户return userRepository.findById(id);
    }
    
  2. @CachePut
    保证方法执行,并将结果更新到缓存(常用于更新操作)。

    @CachePut(value = "users", key = "#user.id")
    public User updateUser(User user) {return userRepository.save(user);
    }
    
  3. @CacheEvict
    移除缓存条目(常用于删除操作)。

    @CacheEvict(value = "users", key = "#id")
    public void deleteUser(Long id) {userRepository.deleteById(id);
    }
    
  4. @Caching
    组合多个缓存注解(如同时更新和删除缓存)。

    @Caching(put = @CachePut(value = "users", key = "#user.id"),evict = @CacheEvict(value = "userList", allEntries = true)
    )
    public User saveUser(User user) {return userRepository.save(user);
    }
    
  5. @CacheConfig
    在类级别统一配置缓存属性(如 valuekeyGenerator),简化方法上的注解。

案例

  • 添加依赖(Maven):
        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>
  • 启用缓存
    在启动类添加 @EnableCaching 注解。
@SpringBootApplication
@EnableTransactionManagement //开启注解方式的事务管理
@Slf4j
@EnableCaching//开启缓存功能
public class SkyApplication {public static void main(String[] args) {SpringApplication.run(SkyApplication.class, args);log.info("server started");}
}
  • c端
    /*** 条件查询** @param categoryId* @return*/@GetMapping("/list")@ApiOperation("根据分类id查询套餐")@Cacheable(cacheNames = "setmealCache",key = "#categoryId")//key: setmealCache::categoryIdpublic Result<List<Setmeal>> list(Long categoryId) {Setmeal setmeal = new Setmeal();setmeal.setCategoryId(categoryId);setmeal.setStatus(StatusConstant.ENABLE);List<Setmeal> list = setmealService.list(setmeal);return Result.success(list);}
  • 管理端
    /*** 新增套餐* @param setmealDTO* @return*/@PostMapping@ApiOperation("新增套餐")@CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")public Result save(@RequestBody SetmealDTO setmealDTO){log.info("新增套餐:{}",setmealDTO);setmealService.saveWithDish(setmealDTO);return Result.success();}/*** 删除套餐* @param ids* @return*/@DeleteMapping@ApiOperation("批量删除套餐")@CacheEvict(cacheNames = "setmealCache",allEntries = true)public Result delete(@RequestParam List<Long> ids){log.info("批量删除套餐:{}",ids);setmealService.deleteBatch(ids);return Result.success();}/*** 修改套餐起售停售状态* @param status* @param id* @return*/@PostMapping("/status/{status}")@ApiOperation("修改套餐起售停售状态")@CacheEvict(cacheNames = "setmealCache",allEntries = true)public Result startOrStop(@PathVariable("status") Integer status, Long id){log.info("套餐起售或停售:{}",id);setmealService.startOrStop(status,id);return Result.success();}

注意事项

  • 缓存键生成:默认使用方法参数生成键,可通过 key 属性自定义(SpEL 表达式),或配置 KeyGenerator
  • 缓存穿透:可通过空值缓存(@Cacheable(unless = "#result == null"))避免。
  • 缓存更新:使用 @CachePut 确保缓存与数据源一致性,避免直接修改缓存。
  • 分布式缓存:在分布式系统中,推荐使用 Redis 等集中式缓存,避免本地缓存(如 Caffeine)的一致性问题。

通过 Spring Cache,开发者可以快速为应用添加缓存能力,提升系统性能,同时保持代码简洁易维护。

http://www.xdnf.cn/news/18224.html

相关文章:

  • 数字政务安全实战:等保2.0下OA系统的身份认证与数据防护
  • Mentalab Hypersync高精度无线同步系统:以亚毫秒级助力ExG多模态数据整合
  • 清空 github 仓库的历史提交记录(创建新分支)
  • django生成迁移文件,执行生成到数据库
  • STM32-FreeRTOS快速入门指南(中)
  • 8.19笔记
  • 自建知识库,向量数据库 (十)之 文本向量化——仙盟创梦IDE
  • 在CentOS系统中查询已删除但仍占用磁盘空间的文件
  • 仲裁器设计(三)-- Weighted Round Robin 权重轮询调度
  • 海滨浴场应急广播:守护碧海蓝天的安全防线
  • 私有化部署全攻略:开源大模型本地化改造的性能与安全深度评测
  • 【iOS】内存管理
  • 【git】 撤销revert一次commit中的某几个文件
  • SpringAIAlibaba之基础功能和基础类源码解析(2)
  • AC 应用控制技术
  • cursor快速了解项目结构-自己用
  • 读《精益数据分析》:营收(Revenue)—— 设计可持续盈利模式
  • 网络通信基础:从数据链路层到传输层
  • 用 C++ 构建高性能测试框架:从原型到生产实战指南
  • cursor+mcp-clickhouse进行数据分析
  • 无人机/航测/三维建模领域常见的“航线规划或建模方式
  • 【CPP】一个CPP的Library(libXXXcore)和测试程序XXX_main的Demo
  • 深入解析:Unity、Unreal Engine与Godot引擎中的Uniform变量管理
  • 易基因:常见生信分析图细节解析(第一期)
  • 通信方式:命名管道
  • 【科研绘图系列】R语言绘制多种小提琴和云雨图
  • Redisson 分布式锁核心机制解析
  • Hive 存储管理测试用例设计指南
  • GaussianLSS
  • RxJava 在 Android 即时通讯中的应用:封装、处理与控制