第一节 Spring Cache介绍
1. Spring Cache 简介
从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。
Spring Cache是作用在方法上的,其核心思想是这样的:
当调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回。所以在使用Spring Cache的时候要保证缓存的方法对于相同的方法参数要有相同的返回结果。
2. Spring Cache 注解
Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。
2.1 @Cacheable
@Cacheable可以标记在一个方法上,也可以标记在一个类上。
-
当标记在一个方法上时表示该方法是支持缓存的
-
当标记在一个类上时则表示该类所有的方法都是支持缓存的
对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。
在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。
@Cacheable常用属性有4个:cacheNames、keyGenerator、condition 和 unless。
-
cacheNames
cacheNames属性是必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组
-
keyGenerator
keyGenerator属性是用来指定缓存数据时使用的键,当没有指定该属性时,Spring将使用默认策略生成key
-
condition
condition属性表示缓存的条件,这个条件与查询的参数有关。当有些查询条件不需要缓存时,可以通过condition来实现过滤。condition属性默认为空,表示将缓存所有的调用情形。
-
unless
unless属性表示缓存的条件,这个条件与查询的结果有关。当有些查询结果不需要缓存时,可以通过unless来实现过滤。unless属性默认为空,表示将缓存所有的调用情形。
2.2 @CachePut
@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是:使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
2.3 @CacheEvict
@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。
@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。
-
value: value表示清除操作是发生在哪些Cache上的(对应Cache的名称)
-
key: key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key
-
condition: condi