Spring Cache缓存框架
一、序言
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值。
Spring Cache缓存框架的更多相关文章
- 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架
前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...
- Spring Cache缓存注解
目录 Spring Cache缓存注解 @Cacheable 键生成器 @CachePut @CacheEvict @Caching @CacheConfig Spring Cache缓存注解 本篇文 ...
- 注释驱动的 Spring cache 缓存介绍
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- [转]注释驱动的 Spring cache 缓存介绍
原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...
- 注释驱动的 Spring cache 缓存介绍--转载
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Spring cache 缓存
概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...
- Spring Cache缓存技术,Cacheable、CachePut、CacheEvict、Caching、CacheConfig注解的使用
前置知识: 在Spring Cache缓存中有两大组件CacheManager和Cache.在整个缓存中可以有多个CacheManager,他们负责管理他们里边的Cache.一个CacheManage ...
- 使用Spring Cache缓存出现的小失误
前文:今天在使用Spring Boot项目使用Cache中出现的小失误,那先将自己创建项目的过程摆出来 1.首先创建一个Spring Boot的项目(我这里使用的开发工具是Intellij IDEA) ...
- 基于Redis的Spring cache 缓存介绍
目录 Cache API及默认提供的实现 demo 依赖包安装 定义实体类.服务类和相关配置文件 Cache注解 启用Cache注解 @CachePut @CacheEvict @Cacheable ...
随机推荐
- simulink模块执行顺序
1.simulink各模块执行顺序 Simulink模块的执行顺序都是序贯进行的,也就是沿着信号的流向进行.没有输入的模块先进行计算,更新状态量与输出,需要输入信号的模块等到输入信号准备ready之后 ...
- 40多个丰富的QQ特效代码,非常实用哦!
Hi,我们好,我是GG!微信和QQ是现在干流的两款社交东西.有人说微信现已完全替代了QQ,现已没有人玩QQ了.可是小雨却不这么以为,毕竟微信和QQ的用户集体是不一样的,它们在功能上的定位也是不一样的. ...
- 『德不孤』Pytest框架 — 8、Pytest断言
目录 1.什么是断言 2.Pytest断言 3.Pytest的断言方式及应用场景 (1)使用assert语句 (2)断言预期的异常 (3)拓展 4.优化断言 5.使用标记检查异常 1.什么是断言 对于 ...
- JAVA的对象和封装及static与final的用法(详解)
一:软件出现的目的 1:用计算机的语言描述现实世界 2:用计算机解决现实世界的问题 编程思维: 使用面向对象的思想(描述)面向对象的世界 (符合人类的思维习惯) 二:面向对象设计和开发程序的 ...
- 修饰符-final
Java是由C/C++泛生的,其也保留了C/C++的部分特性,如关键字.在C/C++中,关键字有着特殊的含义. final修饰符 在编程中,一般会存在一些变量或方法,程序员不让其数据"发生改 ...
- 六、Java方法
Java方法 何为方法 System.out.println(),那么它是什么呢? System是一个类,out是一个对象,println()是一个方法 Java方法是语句的集合,它们在一起执行的 ...
- 基于 vite2 + Vue3 写一个在线帮助文档工具
提起帮助文档,想必大家都会想到 VuePress等,我也体验了一下,但是感觉和我的思路不太一样,我希望的是那种可以直接在线编辑文档,然后无需编译就可以直接发布的方式,另外可以在线写(修改)代码并且运行 ...
- 二级py--day4 数据结构与算法篇
二级py--day4 数据结构与算法篇 1.算法的基本特征:可行性.确定性.有穷性.拥有足够的情报 2.算法的设计要求包括效率与低存储量,既要考虑算法的时间复杂度和空间复杂度 3.算法的优劣:与算法描 ...
- Python:pyglet学习(1):想弄点3D,还发现了pyglet
某一天,我突然喜欢上了3D,在一些scratch教程中见过一些3D引擎,找了一个简单的,结果z轴太大了,于是网上一搜,就发现了pyglet 还是先讲如何启动一个窗口 先看看官网: Creating a ...
- tp5.0使用JWT完成token认证技术
1.安装 composer require firebase/php-jwt 2.封装(在框架根目录extend下新建Token.php) 复制代码 <?php use Firebase\JWT ...