缓存

作者: bit_拳倾天下 | 来源:发表于2021-03-23 21:45 被阅读0次

    1. JSR107 和 Spring 缓存抽象

    JSR107 规范:java 对缓存制定的规范

    JSR107接口关系

    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 为例,可按照如下步骤操作

    1. 首先,安装 redis,
    2. 然后引入 spring-boot-starter-data-redis 的依赖。CacheAutoConfiguration 会自动的条件装配,使用 redis 的 CacheManager。
    3. 配置 redis
      在 spring.redis,是它的相关配置,例如:spring.redis.host

    这样之后的缓存就会利用 redis 进行缓存了。

    相关文章

      网友评论

          本文标题:缓存

          本文链接:https://www.haomeiwen.com/subject/xkoocltx.html