初识Spring Cache

3 阅读2分钟

Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。

一、 Spring Cache 核心介绍

Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如 EHCache、Caffeine 或 Redis(本项目中使用 Redis)。它的主要目的是通过注解简化缓存开发,避免手动编写复杂的缓存逻辑。

二、 常用注解说明

在 Spring Cache 中,常用的注解及其功能如下:

  • @EnableCaching开启缓存注解功能,通常加在项目启动类上。
  • @Cacheable:在方法执行前先查询缓存。如果有数据则直接返回;若无数据,则执行方法并将返回值放入缓存。常用于查询操作。
  • @CachePut:将方法的返回值放入缓存。常用于新增更新操作。
  • @CacheEvict:将一条或多条数据从缓存中删除。常用于删除状态修改操作,以保证缓存与数据库的一致性。

三、 核心技术:动态 Key 处理 (SpEL)

Spring Cache 支持使用 Spring 表达式语言(SpEL) 来动态生成缓存的 Key。这使得我们可以根据方法的参数或返回值来精确控制缓存项:

  1. #user.id:使用参数对象 userid 属性作为 Key。
  2. #result.id:使用方法返回值对象的 id 属性作为 Key。
  3. #p0#a0:代表方法中的第一个参数。
  4. allEntries = true:在 @CacheEvict 中使用,表示删除当前分类名称下的所有缓存

四、 项目实战:套餐管理缓存

在“苍穹外卖”项目中,我们利用 Spring Cache 来优化套餐(Setmeal)的查询性能:

  • 环境准备:在 pom.xml 中导入 spring-boot-starter-cache 坐标,并在启动类 SkyApplication 上添加 @EnableCaching
  • 查询缓存:在用户端 SetmealControllerlist 方法上添加 @Cacheable(cacheNames = "setmealCache", key = "#categoryId")。这样,同一分类的套餐只会在第一次查询时访问数据库。
  • 清理缓存:为了保证数据一致性,在管理端的 save(新增)、delete(删除)、update(修改)等方法上添加 @CacheEvict。例如,删除套餐时使用 allEntries = true 清理掉 setmealCache 下的所有缓存。

五、 概念类比

Spring Cache 就像是给程序员配了一位“智能秘书”:

  • 没有秘书时(手动操作 Redis):你每次都要亲自去仓库(数据库)拿东西,然后自己动手放进展示柜(Redis),还得记得什么时候去清理旧货。
  • 有了秘书后(使用注解):你只需要在文件夹上贴个标签(加注解)。当你想要某份资料时,秘书会先看桌上(缓存)有没有,有就直接给你;没有她再去跑腿拿回来并摆在桌上。当你下令修改或销毁文件时,秘书会自动把桌上过时的副本清理干净。