Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
一、 Spring Cache 核心介绍
Spring Cache 提供了一层抽象,底层可以切换不同的缓存实现,例如 EHCache、Caffeine 或 Redis(本项目中使用 Redis)。它的主要目的是通过注解简化缓存开发,避免手动编写复杂的缓存逻辑。
二、 常用注解说明
在 Spring Cache 中,常用的注解及其功能如下:
@EnableCaching:开启缓存注解功能,通常加在项目启动类上。@Cacheable:在方法执行前先查询缓存。如果有数据则直接返回;若无数据,则执行方法并将返回值放入缓存。常用于查询操作。@CachePut:将方法的返回值放入缓存。常用于新增或更新操作。@CacheEvict:将一条或多条数据从缓存中删除。常用于删除或状态修改操作,以保证缓存与数据库的一致性。
三、 核心技术:动态 Key 处理 (SpEL)
Spring Cache 支持使用 Spring 表达式语言(SpEL) 来动态生成缓存的 Key。这使得我们可以根据方法的参数或返回值来精确控制缓存项:
#user.id:使用参数对象user的id属性作为 Key。#result.id:使用方法返回值对象的id属性作为 Key。#p0或#a0:代表方法中的第一个参数。allEntries = true:在@CacheEvict中使用,表示删除当前分类名称下的所有缓存。
四、 项目实战:套餐管理缓存
在“苍穹外卖”项目中,我们利用 Spring Cache 来优化套餐(Setmeal)的查询性能:
- 环境准备:在
pom.xml中导入spring-boot-starter-cache坐标,并在启动类SkyApplication上添加@EnableCaching。 - 查询缓存:在用户端
SetmealController的list方法上添加@Cacheable(cacheNames = "setmealCache", key = "#categoryId")。这样,同一分类的套餐只会在第一次查询时访问数据库。 - 清理缓存:为了保证数据一致性,在管理端的
save(新增)、delete(删除)、update(修改)等方法上添加@CacheEvict。例如,删除套餐时使用allEntries = true清理掉setmealCache下的所有缓存。
五、 概念类比
Spring Cache 就像是给程序员配了一位“智能秘书”:
- 没有秘书时(手动操作 Redis):你每次都要亲自去仓库(数据库)拿东西,然后自己动手放进展示柜(Redis),还得记得什么时候去清理旧货。
- 有了秘书后(使用注解):你只需要在文件夹上贴个标签(加注解)。当你想要某份资料时,秘书会先看桌上(缓存)有没有,有就直接给你;没有她再去跑腿拿回来并摆在桌上。当你下令修改或销毁文件时,秘书会自动把桌上过时的副本清理干净。