1. JSR107 和 Spring 缓存抽象
JSR107 规范:java 对缓存制定的规范
Spring 缓存抽象:spring 制定缓存的规范
Spring 缓存抽象相对于 JSR107,使用更简单。Spring 缓存抽象只保存了 JSR107 中的 CacheManager 和 Cache 的概念,有自己的一些注解,但同时还支持 JSR107 的注解。
Cache:缓存接口,有不同的实现,如:RedisCache,EhCacheCache , ConcurrentMapCache。。。
CacheManager:缓存管理器,用于管理缓存
2. Spring 缓存抽象注解
@EnableCaching
标注在主配置类上,开启缓存,是下面几个注解生效的的前提
@Cacheable
标注在方法上,将方法的返回值存入缓存。第一次调用该方法的时候,会真正执行方法,并将返回值缓存,再次调用该方法则直接从缓存中获取,不会子执行方法。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Cacheable {
//缓存组件名
@AliasFor("cacheNames")
String[] value() default {};
@AliasFor("value")
String[] cacheNames() default {};
//key,在缓存中的 key,默认是方法入参的值,支持 spel 表达式,如下图
String key() default "";
//key 的生成器,和 key不能共存
String keyGenerator() default "";
//指定缓存管理器
String cacheManager() default "";
//指定缓存解析器
String cacheResolver() default "";
//满足某些条件才缓存
String condition() default "";
//满足某些条件就不缓存,其他情况全部缓存
String unless() default "";
//是否异步,默认是不开启异步,如果开启, 就不能使用unless
boolean sync() default false;
}
key
@CacheEvict
用来清空缓存
@CachePut
标注在方法上,和 @Cacheable 不同,他标注的方法不会因为有了缓存就不执行方法了,每次都会都会真正执行,同事用新的返回值替换掉原来的缓存,用来修改缓存
后面两个注解的属性和 @Cacheable 的属性几乎相同
另外 @CacheConfig,@Caching 可用于复杂的缓存规则
3. 缓存中间件
SpringBoot 的默认缓存中间件是 ConcurrentMapCache,如果想用其它中间件,以 redis 为例,可按照如下步骤操作
- 首先,安装 redis,
- 然后引入 spring-boot-starter-data-redis 的依赖。CacheAutoConfiguration 会自动的条件装配,使用 redis 的 CacheManager。
- 配置 redis
在 spring.redis,是它的相关配置,例如:spring.redis.host
这样之后的缓存就会利用 redis 进行缓存了。
网友评论