29、springboot——缓存之JSR107——缓存的运行流程+@Cacheable的其它属性的使用②
一、运行流程:
@Cacheable
1.方法运行之前先去查询缓存组件,按照Cache的name取获取(CacheManager先获取相应的缓存)
第一次获取缓存没有则会自动创建
2.取Cache中查找缓存,使用以可key,默认就是方法的参数
key是按照某种策略生成的,默认使用keyGenerator,默认使用SimpleKeyGenerator
3.没有查到缓存就调用目标方法
4.将目标方法返回的结果放入缓存中
@Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,
默认按照参数的值作为key取查询缓存
如果没有就运行方法并且将结果放入缓存
二、其它属性的使用:
1、key:
@Cacheable(cacheNames = {"emp"},key = "#root.methodName+'['+#id+']'") public Employee getEmp(Integer id){ System.out.println("查询"+id+"号员工"); Employee employee = employeeMapper.getEmpById(id); return employee; }
此时方法返回的结果的key是:方法名+[方法参数为id的值](这里例子则key为:getEmp[1])
2、keyGenerator:key的生成器(springboot默认使用的key生成器是使用方法中的参数作为key)
我们可以自定义keyGenerator
在配置类中注册一个自定义KeyGenerator
@Configuration public class MyCacheConfig { @Bean("myKeyGenerator") public KeyGenerator keyGenerator(){ return new KeyGenerator(){ @Override public Object generate(Object o, Method method, Object... params) { //指定返回结果的key为:方法名[方法的所有参数] String key = method.getName()+"["+ Arrays.asList(params)+"]"; return key; } }; } }
然后在方法中指定key的生成器(注意key和keyGenerator两个属性只能使用其中之一)
@Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator") public Employee getEmp(Integer id){ System.out.println("查询"+id+"号员工"); Employee employee = employeeMapper.getEmpById(id); return employee; }
通过debug调试我们可以看到确实进入了我们自定义生成器的方法中并生成了按我们步骤所确定的key
3、cacheManager:指定缓存管理器
4、condition:符合条件的情况下才缓存
这里以参数id的值>1时才进行缓存(需要缓存的条件由自己灵活定制 )
@Cacheable(cacheNames = {"emp"},keyGenerator = "myKeyGenerator",condition = "#id>1") public Employee getEmp(Integer id){ System.out.println("查询"+id+"号员工"); Employee employee = employeeMapper.getEmpById(id); return employee; }
连续访问两次查询一号员工的链接:
每次都会进行SQL查询,说明没有缓存
但连续访问两次查询2号员工的链接则只是第一次的时候进行了查询,之后就是在缓存中拿,说明condition属性配置成功
5、unless:当unless指定的条件为true时;方法的返回值就不会缓存了(正好与condition属性相反)
6、sync:是否使用异步模式;默认不使用
分类:
SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)