本文将详细介绍@Cacheable注解,从缓存的基本概念,到@Cacheable的使用步骤、常用属性,以及如何用SpEL编写缓存键,让你全面掌握@Cacheable注解的使用。

一、Spring Boot缓存基础概念

(一)缓存的引入

从Spring 3.1版本起,就加入了对缓存(Cache)的支持。这就好比给应用加了一个“记忆小助手”,能记住之前处理过的数据,下次要用时直接拿出来,不用再重复处理,大大提高了程序运行速度。

Spring定义了org.springframework.cache.Cacheorg.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常用属性说明

  1. cacheNames/value:这个属性用来指定把方法的返回结果存到哪个缓存组件里。可以用数组的形式指定多个缓存,就像把东西放到不同的“箱子”里。比如@Cacheable(cacheNames = {"emps1", "emps2"})
  2. key:它是缓存数据时用的“钥匙”。默认情况下,用的是方法参数的值。不过,也可以用SpEL表达式(Spring表达式语言)来编写更灵活的“钥匙”。比如@Cacheable(cacheNames = "emps", key = "#id + '_employee'"),这样生成的“钥匙”就是id的值加上_employee
  3. keyGenerator:这是“钥匙”的生成器,可以自己定义生成“钥匙”的规则。使用它时,和key属性一般二选一。如果用了keyGenerator,缓存里“钥匙”的生成规则就按你自定义的来。
  4. cacheManager:通过这个属性可以指定从哪个“缓存管理员”(CacheManager)那里获取缓存。就像在多个仓库里选择从哪个仓库取东西一样。
  5. condition:这个属性用来设置缓存的条件。只有满足设定条件时,方法返回的数据才会被缓存。比如@Cacheable(cacheNames = "emps", condition = "#id > 0"),只有当id大于0时,查询结果才会被缓存。
  6. unless:它的作用和condition相反,是否定缓存的。当unless指定的条件为true时,方法的返回值就不会被缓存。还可以通过#result获取方法的结果进行判断。比如@Cacheable(cacheNames = "emps", unless = "#result == null"),如果查询结果为空,就不缓存。
  7. sync:这个属性用来设置是否使用异步模式。默认情况下,方法执行完后,会以同步的方式把返回结果存到缓存里。要是设置为true,就会用异步方式,方法执行完不用等结果存到缓存就可以继续执行其他操作了。

(三)用SpEL编写缓存键

前面提到缓存的“钥匙”(key)可以用SpEL表达式编写,下面简单总结一下用SpEL编写“钥匙”时能用到的一些元数据:

掌握了@Cacheable注解这些知识,在开发Spring Boot应用时,就能更好地利用缓存提升性能啦!希望大家都能熟练运用,有兴趣的朋友可以先去整合下ehcache缓存去练练手吧,springboot整合ehcache3教程如下: