SpringBoot缓存
1. 什么是缓存
缓存一般用于存放不敏感且常用的数据,或者是一些临时性的数据。
缓存的规范是JSR-107,Java Caching 定义了五个接口:
- CachingProvider:定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可以在运行期间访问多个CachingProvider
- CacheManager:定义了创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。
- Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有
- Entry是一个存储在Cache中的key-value对
- Expiry每一个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期的状态,一旦过期,条目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。
但是由于JSR-107的配置比较麻烦;主要是使用的是Spring缓存抽象,其底层也是JSR-107。
Spring缓存抽象
Spring3.1开始定义了Cache
和CacheManager
来简化缓存开发;Cache
接口为缓存定义了组件规范,Cache
接口下的的Spring提供了各种缓存的实现。
2.概念和注解
2.1 概念
- Cache:缓存接口,定义缓存操作;实现由:RedisCache、EhCacheCache、ConcurrentMapCache等
- CacheManager:缓存管理器,管理各种
Cache
组件
2.2 注解
2.2.1@Cacheable
针对方法配置,能够根据方法的请求参数对其结果进行缓存;如果有了相同的缓存,当前方法不会被调用。
属性:
cacheNames/Value
:指定缓存组件的名称;将方法的返回结果放在哪个缓存中,是数组的方式,可以指定多个缓存。key
:缓存数据使用的key,默认是方法的参数,支持SpEL表达式;keyGenerator
:key的生成器,自己指定key的生成器的组件id,keyGenerator
与key
二选一使用cacheManager
缓存管理器:得到缓存集合,与cacheReslover
作用相同二选一使用;condition
:指定符合条件的情况下缓存。unless
:当unless指定的条件为fales才缓存;也可以获取到结果进行判断。sync
:是否使用异步模式
缓存的工作原理和工作流程:
原理:
流程:
- CacheManager先获取相应的缓存:方法运行之前,先去查询Cache(缓存组件),按照cacheNames指定的名字获取;第一次获取缓存会自动创建出来,如果没有Cache组件会自动创建
- 去Cache中查找缓存的内容,使用key;key默认是使用
keyGenerator
生成的,默认使用SimpleKeyGenerator
生成策略生成;SimpleKeyGenerator生成策略:方法中没有参数:key = new SimpleKeyGenerator();
方法中有一个参数:key = 参数的值;如果有多个参数:key = new SimpleKey(params);
- 没有查到缓存就调用目标方法。
- 将目标方法返回的结果放进缓存里面
也就是说在@Cacheable
标注的方法执行之前来查询缓存中有没有对应的key
如果没有就调用该方法,
如果有就跳过该方法。
2.2.2@CacheEvict
清空缓存
属性与@Cacheable大致相同
特别的属性:
allEntries
:是否删掉对应value缓存中的所有数据;属性值为false或者true;默认为false。beforeInvocation
缓存的清除是否在方法之前执行,如果为false,方法在执行过程中出现错误,缓存就不会清除;属性值为false或者true;默认为false;。
2.2.3 @CachePut:
保证方法被调用,又希望被缓存;更新缓存,即使缓存中有值,也会调用该方法,将新的结果放在缓存中。它里面的属性和@Cacheable
基本相同。使用result取出返回结果。当取缓存的key与查询缓存的key的是相同的时,@CachePut
就达到了同时更新缓存的目的。
2.2.4 @Caching:
是@CachePut;@CachePut、@CacheEvict
的整合版;
2.2.5@CacheConfig
抽取缓存的公共配置
3.redis
Spring缓存抽象默认使用的是ConcurrentMapCacheManager
作为缓存,将数据保存在ConcurrentMap
中。
引入redis的starter
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
文章总结自B站:BV1Et411Y7tQ
P72~P76