Spring3.1开始引入了激动人心的缓存(cache)技术,其中包含 @Cacheable、@CachePut、@CacheEvict主要方法
@Cacheable 作用和配置方法
参数 | 解释 | example |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | 例如: @Cacheable(value=”mycache”) @Cacheable(value={”cache1”,”cache2”} |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @Cacheable(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | @Cacheable(value=”testcache”,condition=”#userName.length()>2”) |
@CachePut 作用和配置方法
参数 | 解释 | example |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | @CachePut(value=”my cache”) |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @CachePut(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | @CachePut(value=”testcache”,condition=”#userName.length()>2”) |
@CacheEvict 作用和配置方法
参数 | 解释 | example |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | @CacheEvict(value=”my cache”) |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @CacheEvict(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | @CacheEvict(value=”testcache”,condition=”#userName.length()>2”) |
allEntries | 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 | @CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation | 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 | @CachEvict(value=”testcache”,beforeInvocation=true) |
这里我简单讲一下我使用spring boot 结合cache缓存的用法
@Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。
value:缓存的名称,在 spring 配置文件中定义,必须指定至少一个。如@Cacheable(value=”mycache”) 或者@Cacheable(value={”cache1”,”cache2”}
key:缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合。如@Cacheable(value=”testcache”,key=”#id”)
condition:缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存。如@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
如果用在Springboot中,那么一定要在Springboot启动类上加上@EnableCaching注解和导入Springboot自带的cache包
org.springframework.boot
spring-boot-starter-cache
如下:
@Cacheable(value = "cache1", key = "#name")
public Object get(String name) { return getA(name); }
private Object getA(String name) { return name; }
比如写了一个带缓存的方法如果第一次掉用此方法,传了个id为abc的值,那么Spring就会把return的值给缓存起来,在第二次调用这个方法时传了个efg,那么得到的值就是efg,则不会是abc。
@CachePut(value = "cache1", key = "#name")
public Object updateGet(String name) { return getA(name); }
如果调用updateGet方法,那么会先更新缓存的值再把return的值缓存起来,比如第一次调用updateGet("张三"); 第二次调用get("李四");第三次调用updateGet("王五"); 那么第一次得到的值和第二次得到的值都会是张三,第三次得到的值是王五;
@CacheEvict(value = "cache1", key = "#name")
public void delete(String name) {}
比如第一次调用updateGet("张三");第二次调用delete("张三");第三次调用get("李四");那么第一次得到的结果会是张三,第三次得到的结果是李四;因为第二次调用delete方法把缓存给清掉了,所以第三次调用其实是没有找到这个缓存从而执行了getA(name) 方法了。
这些是简单的用法,(如说的不对的地方,希望大家给指出)。
谢谢观赏!