一、序言
Spring Cache 是 Spring 体系下标准化缓存框架。Spring Cache 有如下劣势:
- 缓存种类多
反对缓存种类多,常见缓存 Redis、EhCache、Caffeine 均反对。它们之间既能独立应用,也能组合应用。
- 平滑迁徙
Spring 外部反对的缓存,可实现无缝平滑迁徙,无需批改业务逻辑。注解缓存的实现依赖于动静代理。
大多数状况下应用的是注解版、多数状况下也能应用编程版。注解版与业务代码高度解藕,因其依靠动静代理技术实现,应用场景上有肯定的限度。编程版嵌入业务代码,代码程序执行,无前置应用条件。
二、基本概念
(一)外围概念
一个利用能够有多个缓存管理器,每个缓存管理器能够有多个缓存,每个缓存能够存储多条记录。
1、缓存管理器
缓存的存储介质不同、缓存连贯不同的数据库、缓存值序列化等由缓存管理器配置。缓存管理器有主次之分,默认状况下应用主(首要)缓存管理器。
当服务内只有一个 CacheManager 时,默认应用此缓存管理器;当超过一个缓存管理器时,须要应用 Primary
注解指定默认缓存管理器。
2、缓存
Cache 是一组配置雷同缓存的汇合,能够了解为命名空间,Spring Cache 体系下的缓存生命工夫是以 Cache 为单位的,不反对以 Key 为单位设置生存工夫。不同的业务对应不同的缓存配置,应在缓存处予以辨别。
CacheName 应具备显著的业务区分度以及过期工夫区分度,并且以全局常量的形式提供,采取集中化治理的形式,禁止采纳魔术变量的形式指定 CacheName。
(二)补充内容
一般来说缓存的 Key 与 Value 均是 String 类型,特地是 Value 通常序列化成 JSON 串。
三、注解版
用于基于注解的形式来治理缓存数据。注解缓存有如下劣势:
- 高度解藕
应用注解来实现缓存,与业务高度解藕。
- 灵便治理
通过全局配置,不批改缓存逻辑,可实现如下成果:
开发环境下,可禁用缓存,将流量打入数据库,尽早的裸露可能存在的性能瓶颈;测试环境开启缓存,进行压力测试等。
(一)动静代理
Spring Cache 缓存注解版的原理以及缓存配置失败的典型案例。
1、CGLib 动静代理
缓存的实现底层技术支持是 CGLib 动静代理,在指标办法调用前、后别离追加相应的缓存操作,以达到增加缓存、更新缓存、删除缓存的操作。
如果注解缓存配置未失效,查看指标调用办法是否被动静代理。
2、配置生效
配置生效是指只管配置了缓存注解,但缓存依然未失效。
- final 类与 final 办法
final 类与 final 办法不满足 CGLib 动静代理的条件,因而缓存配置会生效。
- 外部调用
应用依赖注入的形式调用配置缓存的办法失效,办法间外部调用不失效。
- 非 public 办法
非 public 办法配置缓存不失效。
(二)罕用注解
1、配置注解
(1)EnableCaching
标注于 SpringBoot 利用启动类上,增加此注解示意开启 Spring Cache 缓存;移除示意敞开缓存。如果在全局配置文件中增加如下配置,即便在启动类上标注 EnableCaching 注解,Spring Cache 缓存而后是敞开状态。
spring:
cache:
type: none
如果利用中自定义独立于 Spring 容器的缓存,则不受此配置影响。
(2)CacheConfig
标注于类上,更具体的说是标注于业务服务类上。对立配置如下参数信息:
参数 | 含意 | 应用阐明 |
---|---|---|
cacheManager |
缓存管理器 | 缺省指首要的 CacheManager |
cacheNames |
缓存名 | |
keyGenerator |
key 值生成器 |
在类上对立进行配置,类下的办法主动继承相应的配置。
2、缓存注解
(1)Cacheable
增加缓存的外围注解,分两种状况:一是对应 key 值未有缓存数据,先执行办法,而后依据 condition 和 unless 条件决定是否增加缓存;二是对应 key 值已有缓存,不执行办法体,间接返回数据。
参数 keyGenerator
与key
是互斥的,当 key
存在时 keyGenerator
配置主动生效。
- 根底参数
参数 | 含意 | 应用阐明 |
---|---|---|
cacheManager |
缓存管理器 | 缺省指首要的 CacheManager |
cacheNames |
缓存名 | |
keyGenerator |
key 值生成器 | |
key |
key 值 |
- 高级参数
参数 | 含意 | 默认值 | 应用阐明 |
---|---|---|---|
condition |
缓存条件 | 批示满足条件方执行缓存操作,个别应用参数作为条件 | |
unless |
否定缓存 | 当条件为 true,办法的返回值不会被缓存 | |
sync |
同步状态 | false | 示意将办法执行后果以何种形式存入缓存 |
(2)CachePut
更新缓存注解。不论对应 key 值是否有缓存数据,都执行。
- 根底参数
参数 | 含意 | 应用阐明 |
---|---|---|
cacheManager |
缓存管理器 | 缺省指首要的 CacheManager |
cacheNames |
缓存名 | |
keyGenerator |
key 值生成器 | |
key |
key 值 |
- 高级参数
参数 | 含意 | 应用阐明 |
---|---|---|
condition |
缓存条件 | 批示满足条件方执行缓存操作,个别应用参数作为条件 |
unless |
否定缓存 | 当条件为 true,办法的返回值不会被缓存 |
(3)CacheEvict
被动革除缓存注解。
- 根底参数
参数 | 含意 | 应用阐明 |
---|---|---|
cacheManager |
缓存管理器 | 缺省指首要的 CacheManager |
cacheNames |
缓存名 | |
keyGenerator |
key 值生成器 | |
key |
key 值 |
- 高级参数
参数 | 含意 | 默认值 | 应用阐明 |
---|---|---|---|
condition |
缓存条件 | 批示满足条件方执行缓存操作,个别应用参数作为条件 | |
allEntries |
所有缓存 | false | 示意是否清空以后 CacheName 对应的所有缓存 |
beforeInvocation |
调用前 | false | 示意是否在办法调用前清空缓存 |
3、KeyGenerator
默认状况下应用 SimpleKeyGenerator 键值生成器,当不指定 key 值时,依据生成器规定,将办法参数转化为缓存 Key 值。
喜爱本文点个♥️赞♥️反对一下,如有须要,可通过微信
dream4s
与我分割。相干源码在 GitHub,视频解说在 B 站,本文珍藏在博客天地。