文章目录
  1. 1. Spring3.1的缓存机制
    1. 1.1.
    2. 1.2.
    3. 1.3. :几个重要概念&缓存注解
    4. 1.4. 三:SpEL上下文数据
  2. 2. Springboot自动配置缓存

Spring3.1的缓存机制

  Spring 3.1 新增了一种全新的缓存机制,这种缓存机制与Spring容器无缝地整合在一起,可以对容器中的任意Bean或Bean的方法增加缓存。Spring的缓存机制非常灵活,它可以对容器中的任意Bean或的Bean的任意方法进行缓存,因此这种缓存机制可以在Java EE应用的任何层次上进行缓存。

提示 : 与Hibernate SessionFactory级别的二级缓存相比,Spring 缓存的级别更高,SPring缓存可以在控制组件或业务逻辑组件级别进行缓存,这样应用完全无须重复调用底层的DAO组件的方法。

  Spring 缓存同样不是一种具体的缓存实现方案,它底层同样需要依赖EhCache、Guava等具体的缓存实现。但这也正是Spring缓存机制的优势,应用程序只要面向Spring缓存API编程,应用底层的缓存实现可以在不同的缓存实现之间自由切换,应用程序无须任何改变,只要对配置文件略作修改即可。

Spring从3.1开始定义了org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术;并支持使用JCache(JSR-107)注解简化我们开发;

  • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合;

  • Cache接口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache ,ConcurrentMapCache等;

  • 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。

  • 使用Spring缓存抽象时我们需要关注以下两点;

    1、确定方法需要被缓存以及他们的缓存策略

    2、从缓存中读取之前缓存存储的数据

    :几个重要概念&缓存注解

    | 名称 | 解释 |
    | ————– | ———————————————————— |
    | Cache | 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、ConcurrentMapCache等 |
    | CacheManager | 缓存管理器,管理各种缓存(cache)组件 |
    | @Cacheable | 主要针对方法配置,能够根据方法的请求参数对其进行缓存 |
    | @CacheEvict | 清空缓存 |
    | @CachePut | 保证方法被调用,又希望结果被缓存。 与@Cacheable区别在于是否每次都调用方法,常用于更新 |
    | @EnableCaching | 开启基于注解的缓存 |
    | keyGenerator | 缓存数据时key生成策略 |
    | serialize | 缓存数据时value序列化策略 |
    | @CacheConfig | 统一配置本类的缓存注解的属性 |

    @Cacheable/@CachePut/@CacheEvict 主要的参数

    | 名称 | 解释 |
    | —————————— | ———————————————————— |
    | 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”) |
    | unless | 否定缓存。当条件结果为TRUE时,就不会缓存。 @Cacheable(value=”testcache”,unless=”#userName.length()>2”) |
    | allEntries (@CacheEvict ) | 是否清空所有缓存内容,缺省为 false,如果指定为 true, 则方法调用后将立即清空所有缓存 例如: @CachEvict(value=”testcache”,allEntries=true) |
    | beforeInvocation (@CacheEvict) | 是否在方法执行前就清空,缺省为 false,如果指定为 true, 则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法 执行抛出异常,则不会清空缓存 例如: @CachEvict(value=”testcache”,beforeInvocation=true) |

    三:SpEL上下文数据

    Spring Cache提供了一些供我们使用的SpEL上下文数据,下表直接摘自Spring官方文档:

    | 名称 | 位置 | 描述 | 示例 |
    | ————- | ———- | ———————————————————— | ———————- |
    | methodName | root对象 | 当前被调用的方法名 | #root.methodname |
    | method | root对象 | 当前被调用的方法 | #root.method.name |
    | target | root对象 | 当前被调用的目标对象实例 | #root.target |
    | targetClass | root对象 | 当前被调用的目标对象的类 | #root.targetClass |
    | args | root对象 | 当前被调用的方法的参数列表 | #root.args[0] |
    | caches | root对象 | 当前方法调用使用的缓存列表 | #root.caches[0].name |
    | Argument Name | 执行上下文 | 当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数 | #artsian.id |
    | result | 执行上下文 | 方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false) | #result |

    注意:

    1.当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性。 如

    1
    @Cacheable(key = "targetClass + methodName +#p0")

    2.使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。 如:

    1
    2
    @Cacheable(value="users", key="#id")
    @Cacheable(value="users", key="#p0")

    SpEL提供了多种运算符

    | 类型 | 运算符 |
    | ———- | ———————————————- |
    | 关系 | <,>,<=,>=,==,!=,lt,gt,le,ge,eq,ne |
    | 算术 | +,- ,* ,/,%,^ |
    | 逻辑 | &&,||,!,and,or,not,between,instanceof |
    | 条件 | ?: (ternary),?: (elvis) |
    | 正则表达式 | matches |
    | 其他类型 | ?.,?[…],![…],^[…],$[…] |

参考:https://www.cnblogs.com/xiang--liu/p/9720344.html

Springboot自动配置缓存

详细原理:

1)、查看自动配置类:CacheAutoConfiguration

2)、断点跟踪可知默认配置了:

  • org.springframework.boot.autoconfigure.cache.GenericCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.JCacheCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.EhCacheCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.HazelcastCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.InfinispanCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.CouchbaseCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.CaffeineCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.GuavaCacheConfiguration
  • org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration【默认】
  • org.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration

    默认SimpleCacheConfiguration生效

3)、给容器中注册了一个CacheManager:ConcurrentMapCacheManager;

4)、获取和创建ConcurrentMapCache类型的缓存组件,他的作用将数据保存在ConcurrentMap中;

5)、 运行流程:

​ 方法运行之前,先去查询Cache(缓存组件),按照cacheNames指定的名字获取,(CacheManager先获取相应的缓存),第一次获取缓存如果没有Cache组件会自动创建;

​ 去Cache中查找缓存的内容,使用一个key,默认就是方法的参数,key是按照某种策略生成的,默认是使用keyGenerator生成的,默认使用SimpleKeyGenerator生成key,SimpleKeyGenerator生成key的默认策略:如果没有参数:key=new SimpleKey();如果有一个参数:key=参数的值;如果有多个参数:key=new SimpleKey(params);
​ 没有查到缓存就调用目标方法,将目标方法返回的结果,放进缓存中,@Cacheable标注的方法执行之前先来检查缓存中有没有这个数据,默认按照参数的值作为key去查询缓存,如果没有就运行方法并将结果放入缓存,以后再来调用就可以直接使用缓存中的数据。

原文链接:https://blog.csdn.net/xm393392625/article/details/88625681

文章目录
  1. 1. Spring3.1的缓存机制
    1. 1.1.
    2. 1.2.
    3. 1.3. :几个重要概念&缓存注解
    4. 1.4. 三:SpEL上下文数据
  2. 2. Springboot自动配置缓存