Spring @Cacheable缓存注解用法说明

注解Cacheable 是 Spring 框架中用于缓存数据的方法或类的注解。通过使用这个注解,你可以避免重复计算和重复获取数据,从而提高应用程序的性能。

基本用法

  • 引入依赖

确保在你的项目中引入了 Spring Cache 相关的依赖。如果你使用的是 Spring Boot,可以在 pom.xml 中添加以下依赖:

html 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
  • 启用缓存

在主类或配置类上使用 @EnableCaching 注解来启用缓存功能。

java 复制代码
@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
  • 使用 @Cacheable 注解

在需要缓存的方法上使用 @Cacheable 注解。

bash 复制代码
@Service
public class UserService {

    @Cacheable("lizz:users")
    public User getUserById(Long id) {
        // 模拟一个耗时的数据库查询
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return new User(id, "John Doe");
    }
}
  • 配置缓存

Spring 提供了多种缓存实现,包括内存缓存(如 ConcurrentMapCache)、第三方缓存(如 EhCache、Caffeine、Redis 等)。可以在配置文件(如 application.propertiesapplication.yml)中进行配置。

  • 使用 ConcurrentMapCache本地缓存
bash 复制代码
spring:
  cache:
    type: simple
  • 使用 Redis 作为缓存
bash 复制代码
spring:
  cache:
    type: redis
  redis:
    host: 172.1.1.11
    port: 6379

高级用法

  • 缓存条件: condition

使用 condition 属性指定缓存条件,只换成id大于10的数据缓存

java 复制代码
@Cacheable(value = "lizz:users", condition = "#id > 10")
public User getUserById(Long id) {
    // ...
}
  • 自定义缓存键

使用 key 属性自定义缓存键。

java 复制代码
@Cacheable(value = "users", key = "#root.methodName + #id")
public User getUserById(Long id) {
    // ...
}
  • **同步更新:**sync

sync=true时,如果多个线程同时访问缓存中没有的数据,只有一个线程会执行方法以加载数据,其他线程会等待加载完成并获取相同的结果。这可以防止缓存穿透(即多个线程同时访问缓存时都绕过缓存直接访问底层存储)。

java 复制代码
@Cacheable(value = "users", sync = true)
public User getUserById(Long id) {
    // ...
}

缓存失效:@CacheEvict

  • allEntries=true:清除所有缓存数据
java 复制代码
@CacheEvict(value = "lizz:users", allEntries = true)
public void clearCache() {
    // //清除全部缓存相关的其他业务操作
}
  • key = "#id" :清除缓存集合中指定key的数据
java 复制代码
@CacheEvict(value = "lizz:users", key = "#id")
public void delUser(Long id) {
    //清除id缓存相关的其他业务操作
}
  • 缓存同步: @CachePut

使用 @CachePut 注解更新缓存。

java 复制代码
@CachePut(value = "lizz:users", key = "#user.id")
public User updateUser(User user) {
    // 更新用户的逻辑
    return user;
}

结合缓存组件

  • 引入caffeine
html 复制代码
        <!--快速本地缓存-->
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
        </dependency>
  • 使用caffeine作为springcache管理
java 复制代码
@EnableCaching
@Configuration
public class CaffeineCacheConfig {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager("ta:region");
        cacheManager.setCaffeine(caffeineCacheBuilder());
        return cacheManager;
    }

    Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                .expireAfterWrite(1, TimeUnit.MINUTES)
                .maximumSize(100);
    }
}
相关推荐
摇滚侠16 分钟前
Spring Boot3零基础教程,SpringApplication 自定义 banner,笔记54
java·spring boot·笔记
摇滚侠16 分钟前
Spring Boot3零基础教程,Spring Boot 完成了哪些Spring MVC 自动配置,笔记49
spring boot·spring·mvc
青云交18 分钟前
Java 大视界 -- Java 大数据机器学习模型在游戏用户行为分析与游戏平衡优化中的应用
java·大数据·机器学习·数据存储·模型构建·游戏用户行为分析·游戏平衡优化
暗武逢天3 小时前
Java导出写入固定Excel模板数据
java·导出数据·easyexcel·excel固定模板导出
摇滚侠3 小时前
Spring Boot3零基础教程,KafkaTemplate 发送消息,笔记77
java·spring boot·笔记·后端·kafka
fat house cat_6 小时前
【netty】基于主从Reactor多线程模型|如何解决粘包拆包问题|零拷贝
java·服务器·网络·netty
青云交7 小时前
Java 大视界 -- Java 大数据在智能教育学习社区互动模式创新与用户活跃度提升中的应用(426)
java·大数据·学习·flink 实时计算·智能教育社区·互动模式创新·用户活跃度
神奇的海马体7 小时前
Tomcat隐藏版本号
java·tomcat
拜见老天師7 小时前
使用mybatis-plus,实现将排序时,字段值为NULL的数据排在最后
java·mybatis
xiaogg36787 小时前
redis-cluster集群配置部署
数据库·redis·缓存