Spring Cache缓存框架

简介: Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。

一、序言

Spring Cache是Spring体系下标准化缓存框架。Spring Cache有如下优势:

  • 缓存品种多

支持缓存品种多,常见缓存RedisEhCacheCaffeine均支持。它们之间既能独立使用,也能组合使用。

  • 平滑迁移

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缓存然后是关闭状态。

yml

体验AI代码助手

代码解读

复制代码

spring:
  cache:
    type: none

如果应用中自定义独立于Spring容器的缓存,则不受此配置影响。

(2)CacheConfig

标注于类上,更具体的说是标注于业务服务类上。统一配置如下参数信息:

参数 含义 使用说明
cacheManager 缓存管理器 缺省指首要的CacheManager
cacheNames 缓存名
keyGenerator key值生成器

在类上统一进行配置,类下的方法自动继承相应的配置。

2、缓存注解

(1)Cacheable

添加缓存的核心注解,分两种情况:一是对应key值未有缓存数据,先执行方法,然后根据condition和unless条件决定是否添加缓存;二是对应key值已有缓存,不执行方法体,直接返回数据。

参数keyGeneratorkey是互斥的,当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值。


转载来源:https://juejin.cn/post/7080420986662682637

相关文章
|
5月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
418 2
|
4月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
6月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
4月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
291 8
|
5月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
927 5
|
5月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
627 1
|
5月前
|
存储 缓存 Java
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
缓存是提升应用性能的重要技术,Spring框架提供了丰富的缓存注解,如`@Cacheable`、`@CacheEvict`等,帮助开发者简化缓存管理。本文介绍了如何在Spring中配置缓存管理器,使用缓存注解优化数据访问,并探讨了缓存的最佳实践,以提升系统响应速度与可扩展性。
377 0
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
|
6月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1939 10
|
6月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
1262 0
|
9月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?