提升性能!彻底玩转缓存在Spring Boot中的各种应用技巧

文摘   2024-10-19 11:31   新疆  

最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。

环境:SpringBoot3.2.5



1. 简介

Spring Cache是Spring框架提供的一整套缓存解决方案,它不是具体的缓存实现,而是提供了接口、代码规范、配置和注解等,用于整合各种缓存方案如Caffeine、Guava Cache、Ehcache、Redis等。通过使用Spring Cache,可以显著提高应用程序的性能,因为它允许将常用数据缓存在内存中,避免了重复的数据库查询或计算,从而减少了响应时间,提高了系统吞吐量。

1.1 核心注解

对于缓存声明,Spring的缓存抽象提供了一组Java注解:

  • @Cacheable: 触发缓存储存

  • @CacheEvict: 触发缓存回收

  • @CachePut: 更新缓存,而不会影响方法的执行

  • @Caching: 将多个缓存操作组合起来应用于一个方法

  • @CacheConfig: 在类级共享一些常见的缓存相关设置


1.2 基本使用

开启缓存功能

@SpringBootApplication@EnableCachingpublic class SpringbootCacheApplication {}

通过@EnableCaching开启缓存功能,也就是上面的注解才能生效。

在需要缓存的方法上添加相应注解

@Cacheable(cacheNames = "persons")public Person save(Person person) {}

指定了缓存的名称(对应到redis,相当于加了个命名空间)。而缓存到redis中默认key为persons::Person#toString()。

更新缓存

@CachePut(cacheNames = "persons", key="#person.id")public Person update(Person person)

清除缓存

@CacheEvict(cacheNames = "persons", key = "#id")public void deleteById(Long id)

指定多个注解

当你需要指定相同类型的多个注解(例如@CacheEvict@CachePut)。例如,因为条件或键表达式在不同的缓存之间是不同的。 @Caching允许在同一方法上使用多个嵌套的@Cacheable@CachePut@CacheEvict。以下示例使用两个@CacheEvict注解:

@Caching(evict = {   @CacheEvict(cacheNames = "primary", key="#p0"),   @CacheEvict(cacheNames="secondary", key="#id") })public void delete(String name, String id)

以上是缓存注解的基本使用,接下来将介绍其它高级开发技巧。

2. 高级应用

2.1 自定义注解

通过模板机制可以非常方便的定义通用的注解来消除重复的代码,如下示例:

@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD})@Cacheable(cacheNames="persons", key="#person.id")public @interface PackCache {}

使用

@PackCachepublic Person save(Person person)

简化了添加注解的代码,Spring会自动解析识别到我们自定义注解上添加的相关@Cache*注解。

2.2 切换缓存实现

当前我的环境引入了redis,所以会自动的创建RedisCacheManager对象。你可以在容器中配置其它的CacheManager,然后通过@Cache*对应的cacheManager属性指定你要使用的cacheManager beanName。

Spring全家桶实战案例源码
spring, springboot, springcloud 案例开发详解
 最新文章