千家信息网

SpringBoot怎样进行缓存

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,SpringBoot怎样进行缓存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。缓存技术是一个让所有开发人员又爱又恨的技术,我们爱缓存是因
千家信息网最后更新 2026年11月03日SpringBoot怎样进行缓存

SpringBoot怎样进行缓存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

缓存技术是一个让所有开发人员又爱又恨的技术,我们爱缓存是因为缓存能给我们带来数量级的响应和流量,但是最迷人的反而最危险,如果缓存用不好也是灾难级别的,特别是一些涉及到公司主要现金流的业务,如果因为我们使用缓存不当,而带给公司一定的损失,不亚于删库跑路的那个大兄弟,那今天我们就来看一下springboot的缓存都有那些东西,学习嘛,一点点的来,慢慢积累自己的经验,才能厚积薄发

一、JSR107缓存规范

为了缓存开发规范的统一,以及提升系统的扩展性,J2EE发布了JSR107缓存规范。 主要是Java Caching定义了5个接口,分别是CachingProvider、CacheManager、Cache、Entry、Expiry。

下面我们分开详细的展开看一下

  • CachingProvider:

  • 可以创建、配置、获取、管理和控制多个CacheManager,一个Application在运行期间可以访问多个CachingProvider。

  • CacheManager:

  • 可以创建、配置、获取、管理和控制多个唯一命名的Cache,这些Cache存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider所拥有。

  • Cache:

  • 是一个类似于Map的数据结构并临时存储以Key为索引的值。一个Cache仅被一个CacheManager所拥有。

  • Entry:

  • 是存储在Cache中的Key-Value对。

  • Expiry:

  • 每一个缓存在Cache中的条目有一个定义的有效期,一旦超过这个时间,该条目就为过期状态,一旦过期,条目将不可访问、更新和删除。其中缓存的有效期可以通过ExpiryPolicy设置。

  • 如果说这样讲解让你有点蒙圈的话,那没关系,我们看下面这张图

简单总结一下就是:一个应用里面可以有多个缓存提供者(CachingProvider),一个缓存提供者可以获取到多个缓存管理器(CacheManager),一个缓存管理器管理着不同的缓存(Cache),缓存中是一个个的缓存键值对(Entry),每个entry都有一个有效期(Expiry)。缓存管理器和缓存之间的关系有点类似于数据库中连接池和连接的关系。

二、SpringBoot缓存抽象

在我自己看来,没有源码所有的理论讲解,都是空谈,或者说就是扯淡,所以我们来看一下,缓存的源码级操作

Spring从3.1版本开始定义了org.springframework.cache.CacheManager和org.springframework.cache.Cache接口来统一不同的缓存技术,并支持使用JSR-107注解简化开发。 在IDEA中,使用Spring Initializr快速创建Spring Boot项目时,勾选中Cache后,在配置文件中配置debug=true,可以查看Spring Boot的自动配置项。 其中关于缓存的配置类如下:

org.springframework.boot.autoconfigure.cache.GenericCacheConfigurationorg.springframework.boot.autoconfigure.cache.JCacheCacheConfigurationorg.springframework.boot.autoconfigure.cache.EhCacheCacheConfigurationorg.springframework.boot.autoconfigure.cache.HazelcastCacheConfigurationorg.springframework.boot.autoconfigure.cache.InfinispanCacheConfigurationorg.springframework.boot.autoconfigure.cache.CouchbaseCacheConfigurationorg.springframework.boot.autoconfigure.cache.RedisCacheConfigurationorg.springframework.boot.autoconfigure.cache.CaffeineCacheConfigurationorg.springframework.boot.autoconfigure.cache.GuavaCacheConfigurationorg.springframework.boot.autoconfigure.cache.SimpleCacheConfigurationorg.springframework.boot.autoconfigure.cache.NoOpCacheConfiguration

启动项目后,可以在控制台看到匹配到的只有SimpleCacheConfiguration这个自动配置类,而在SimpleCacheConfiguration类中,使用@Bean注解给容器中注册了一个CacheManager,由此可看Spring Boot默认的CacheManager是ConcurrentMapCacheManager。

 SimpleCacheConfiguration matched:      - Cache org.springframework.boot.autoconfigure.cache.SimpleCacheConfiguration automatic cache type (CacheCondition)      - @ConditionalOnMissingBean (types: org.springframework.cache.CacheManager; SearchStrategy: all) did not find any beans (OnBeanCondition)

同样的,我们通过一张图形象的展示一下看看

进入@Caching的源码可以看到,在组合注解内可以使用cacheable、put、evict

public @interface Caching {    Cacheable[] cacheable() default {};    CachePut[] put() default {};    CacheEvict[] evict() default {};}

@Caching的使用

 @Caching(            cacheable = {                    @Cacheable(key = "#name")            },            put = {                    @CachePut(key = "#result.id"),                    @CachePut(key = "#result.cNo")            }    )

@Cacheable、@CachePut、@CacheEvict中的主要参数

key

#缓存的key,可以为空,也可以使用SpEL表达式编写例:@Cacheable(value="stu",key="userName")

condition

#缓存的条件,可以为空,也可以使用SpEL表达式编写,只有为true才缓存/清除缓存,#不管方法执行前后都可以判断例:@Cacheable(value="stu",condition="userName.length()>2")

unless

#用于否定缓存,只在方法执行之后判断,也可以使用SpEL表达式编写#true不缓存,false才缓存例:@Cacheable(value="stu",unless="userName == null")
  • @Cacheable

  • 标注的方法执行之前,先查看缓存中有没有这个数据,默认按照参数的值作为key去缓存中查找。如果没有就运行这个方法并将方法的执行结果放入缓存中,之后再调用该方法时,直接使用缓存中的数据即可。

  • @CachePut

  • 标注的方法必须要执行,它的运行时机是,先调用目标方法,然后将目标方法的结果放入缓存中,但是更新缓存中的数据时,要注意key值,否则缓存中的数据无法更新。

  • @CacheEvict

  • 这个注解中allEntries = true代表要清除某个缓存中的所有数据。beforeInvocation = false代表缓存的清除在方法执行之后执行,如果出现异常等情况,则不会清除缓存中的数据。这是@CacheEvict

  • 注解默认的。beforeInvocation = true代表缓存的清除在方法执行之前执行,出现异常等情况,也会清除缓存中的数据。

  • key的生成策略

  • key的生成默认使用SimpleKeyGenerator生成的,而SimpleKeyGenerator的生成策略有:如果没有参数:key=new SimpleKey();如果有一个参数:key=参数的值如果有多个参数:key=new SimpleKey(params);

看完上述内容,你们掌握SpringBoot怎样进行缓存的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

缓存 方法 数据 配置 参数 多个 管理 注解 生成 有效 代表 技术 有效期 条目 源码 表达式 开发 控制 更新 运行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网产品 互联网属科技 紫鲸互联网科技 互联网科技logo 郑州华宇互联网科技 互联网科技创新企业排名 青海省互联网新科技 富国互联网科技创新基金 互联网科技实习生岗位职责 互联网科技的全部知识 互联网时代的科技公司 杭州披云加互联网科技有限公司 产业互联网科技服务公司 上海创道互联网络科技有限公司 互联网科技年终奖 萌小萌互联网科技河南有限公司 普陀区互联网教育科技管理办法 互联网科技新闻 第三届互联网大会安防黑科技 山东亿川互联网科技有限责任公司 互联网科技图片 北京互联网科技有限公司 四川狮子座互联网科技 互联网科技有限公司 翻译 互联网系的金融科技公司 世界互联网科技公司市值排名 崇明区互联网教育科技售后服务 有人说阿里系是互联网科技企业 西安左小互联网科技有限公司 科技互联网公司两年变化
0