一、序言

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缓存框架的更多相关文章

  1. 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架

    前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...

  2. Spring Cache缓存注解

    目录 Spring Cache缓存注解 @Cacheable 键生成器 @CachePut @CacheEvict @Caching @CacheConfig Spring Cache缓存注解 本篇文 ...

  3. 注释驱动的 Spring cache 缓存介绍

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  4. [转]注释驱动的 Spring cache 缓存介绍

    原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(an ...

  5. 注释驱动的 Spring cache 缓存介绍--转载

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  6. Spring cache 缓存

    概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使 ...

  7. Spring Cache缓存技术,Cacheable、CachePut、CacheEvict、Caching、CacheConfig注解的使用

    前置知识: 在Spring Cache缓存中有两大组件CacheManager和Cache.在整个缓存中可以有多个CacheManager,他们负责管理他们里边的Cache.一个CacheManage ...

  8. 使用Spring Cache缓存出现的小失误

    前文:今天在使用Spring Boot项目使用Cache中出现的小失误,那先将自己创建项目的过程摆出来 1.首先创建一个Spring Boot的项目(我这里使用的开发工具是Intellij IDEA) ...

  9. 基于Redis的Spring cache 缓存介绍

    目录 Cache API及默认提供的实现 demo 依赖包安装 定义实体类.服务类和相关配置文件 Cache注解 启用Cache注解 @CachePut @CacheEvict @Cacheable ...

随机推荐

  1. 微服务从代码到k8s部署应有尽有系列(三、鉴权)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  2. CVE-2021-1732 LPE漏洞分析

    概述 CVE-2021-1732是一个发生在windows内核win32kfull模块的LPE漏洞,并且由于创建窗口时调用win32kfull!xxxCreateWindowEx过程中会进行用户模式回 ...

  3. 手把手带你安装最小化suse 12 linux

    当然. 你需要现有一个vmware,还要有一个suse的镜像,suse镜像可以直接去官网获取,只需要注册一个suse的账号就可以了,官网下载会有点慢,可以使用迅雷下载 F2 可以设置安装界面的语言,可 ...

  4. 我们一起来学Shell - 初识shell

    文章目录 Shell 的分类 `bash` `csh` `ksh` `tcsh` `sh` `nologin` `zsh` Shell 能做什么 bash 环境变量文件 `/etc/profile` ...

  5. ASP.NET Core 6框架揭秘实例演示[09]:配置绑定

    我们倾向于将IConfiguration对象转换成一个具体的对象,以面向对象的方式来使用配置,我们将这个转换过程称为配置绑定.除了将配置树叶子节点配置节的绑定为某种标量对象外,我们还可以直接将一个配置 ...

  6. rinetd基于内网TCP端口转发

    在Linux系统中大多数情况选择用iptables来实现端口转发,iptables虽然强大,但配置不便,而且新手容易出错.在此分享另一个TCP/UDP端口转发工具rinetd,rinetd体积小巧,配 ...

  7. 最强端口扫描器Nmap

    实验目的 利用nmap命令探测出目标系统开放的端口和服务类型. 实验原理 Nmap是一个综合的.功能全面的端口扫描工具主机发现:nmap可以用来查找目标网络中在线主机.默认情况下,nmap通过icmp ...

  8. 【C# IO 操作 】Span<T>类

    Span 原理探究 ref结构 ref struct是仅在堆栈上的值类型: 表现一个顺序结构的布局:(译注:可以理解为连续内存) 只能在堆栈上使用.即用作方法参数和局部变量: 不能是类或正常结构的静态 ...

  9. iOS动态库和静态库的运用

    概念认识 什么是库 库是共享程序代码的方式,库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.在开发过程中,一些核心技术或者常用框架,出于安全性和稳定性的考虑,不想被外界知道,所以会把 ...

  10. 用Assert(断言)封装异常,让代码更优雅(附项目源码)

    有关Assert断言大家并不陌生,我们在做单元测试的时候,看业务事务复合预期,我们可以通过断言来校验,断言常用的方法如下: public class Assert { /** * 结果 = 预期 则正 ...