Spring Boot缓存中的@Cacheable注解详解
本文将详细介绍@Cacheable
注解,从缓存的基本概念,到@Cacheable
的使用步骤、常用属性,以及如何用SpEL编写缓存键,让你全面掌握@Cacheable
注解的使用。
一、Spring Boot缓存基础概念
(一)缓存的引入
从Spring 3.1版本起,就加入了对缓存(Cache)的支持。这就好比给应用加了一个“记忆小助手”,能记住之前处理过的数据,下次要用时直接拿出来,不用再重复处理,大大提高了程序运行速度。
Spring定义了org.springframework.cache.Cache
和org.springframework.cache.CacheManager
接口,这两个接口的作用是把各种不同的缓存技术统一起来管理。同时,它还支持用JCache(JSR - 107)
注解,让开发人员能更轻松地使用缓存功能。它的使用方式和Spring对事务管理的支持有点像,都是在方法层面发挥作用。简单来说,当调用一个有缓存功能的方法时,Spring会把方法的参数和返回结果当成一对“钥匙”和“箱子”,存到缓存里。下次再调用这个方法,Spring先看看缓存里有没有对应的“箱子”,有的话直接拿出来用,没有就先执行方法,再把结果存到缓存里。
(二)Cache和CacheManager接口详解
Cache
接口就像是一个操作缓存的“工具箱”,里面包含了各种对缓存进行操作的方法,像存数据、取数据、删数据等。在这个接口下,Spring还提供了好多不同的实现类,比如RedisCache
(基于Redis的缓存实现)、EhCache
(一种纯Java的进程内缓存框架实现)、ConcurrentMapCache
(基于Java的ConcurrentMap
实现的简单缓存)。
CacheManager
则像是一个“缓存管理员”,负责创建、配置、获取、管理和控制多个有唯一名字的Cache
。这些Cache
都在CacheManager
的管理范围内,就像员工在经理的管理下工作一样。
二、@Cacheable注解使用说明
(一)使用@Cacheable的步骤
1)开启基于注解的缓存:要使用@Cacheable
注解,第一步是在Spring Boot的主启动类上加上@EnableCaching
注解。这就好比给缓存功能“开了个门”,让它能在项目里发挥作用。
2)标注缓存注解:在需要缓存的方法上标注@Cacheable
注解。例如:
@Cacheable(cacheNames = "emps", key = "#id")// #id 就表示取出参数 id 的值作为 key public Employee getEmployee(Integer id) { System.out.println("查询" + id); Employee employee = employeeMapper.getEmpById(id); return employee; }
这段代码里,@Cacheable
注解的作用是把getEmployee
方法的运行结果缓存起来。以后再查询相同id
的员工信息时,直接从缓存里取,不用再执行getEmployee
方法里面的查询操作了。
(二)@Cacheable常用属性说明
- cacheNames/value:这个属性用来指定把方法的返回结果存到哪个缓存组件里。可以用数组的形式指定多个缓存,就像把东西放到不同的“箱子”里。比如
@Cacheable(cacheNames = {"emps1", "emps2"})
。 - key:它是缓存数据时用的“钥匙”。默认情况下,用的是方法参数的值。不过,也可以用SpEL表达式(Spring表达式语言)来编写更灵活的“钥匙”。比如
@Cacheable(cacheNames = "emps", key = "#id + '_employee'")
,这样生成的“钥匙”就是id
的值加上_employee
。 - keyGenerator:这是“钥匙”的生成器,可以自己定义生成“钥匙”的规则。使用它时,和
key
属性一般二选一。如果用了keyGenerator
,缓存里“钥匙”的生成规则就按你自定义的来。 - cacheManager:通过这个属性可以指定从哪个“缓存管理员”(
CacheManager
)那里获取缓存。就像在多个仓库里选择从哪个仓库取东西一样。 - condition:这个属性用来设置缓存的条件。只有满足设定条件时,方法返回的数据才会被缓存。比如
@Cacheable(cacheNames = "emps", condition = "#id > 0")
,只有当id
大于0时,查询结果才会被缓存。 - unless:它的作用和
condition
相反,是否定缓存的。当unless
指定的条件为true
时,方法的返回值就不会被缓存。还可以通过#result
获取方法的结果进行判断。比如@Cacheable(cacheNames = "emps", unless = "#result == null")
,如果查询结果为空,就不缓存。 - sync:这个属性用来设置是否使用异步模式。默认情况下,方法执行完后,会以同步的方式把返回结果存到缓存里。要是设置为
true
,就会用异步方式,方法执行完不用等结果存到缓存就可以继续执行其他操作了。
(三)用SpEL编写缓存键
前面提到缓存的“钥匙”(key
)可以用SpEL表达式编写,下面简单总结一下用SpEL编写“钥匙”时能用到的一些元数据:
掌握了@Cacheable
注解这些知识,在开发Spring Boot应用时,就能更好地利用缓存提升性能啦!希望大家都能熟练运用,有兴趣的朋友可以先去整合下ehcache缓存去练练手吧,springboot整合ehcache3教程如下: