@Cacheable、@CachePut和@CacheEvict三个注解的使用及区别

 更新时间:2026年05月21日 10:07:07   作者:dushky  
@Cacheable、@CachePut和@CacheEvict是Spring框架中的核心缓存注解,分别用于查询、更新和删除缓存操作,@Cacheable在缓存命中时跳过方法执行;@CachePut强制执行并更新缓存;@CacheEvict删除或清空缓存,注意事项包括键的一致性、事务处理和条件过滤等

在 Spring 框架中,@Cacheable@CachePut 和 @CacheEvict 是三个与缓存管理相关的核心注解,它们与 Redis 等缓存中间件结合使用时,可以显著提升应用性能。

以下是它们的核心区别和适用场景:

@Cacheable

作用

在方法执行前检查缓存,如果缓存中存在对应结果,直接返回缓存值,跳过方法执行;若不存在,则执行方法并将返回值存入缓存。

适用场景

  • 查询操作(例如根据 ID 查询用户信息)。
  • 适用于结果稳定、不频繁变更的数据。

关键参数

  • value/cacheNames:缓存名称(如 "users")。
  • key:缓存的键(支持 SpEL 表达式)。
  • condition/unless:缓存条件(如 condition="#id > 10")。

示例

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    // 查询数据库
    return userRepository.findById(id);
}

@CachePut

作用

无论缓存是否存在,始终执行方法,并将返回值更新到缓存中。适用于需要强制刷新缓存的场景。

适用场景

  • 更新操作(例如修改用户信息后同步更新缓存)。
  • 需要确保缓存与数据库数据一致。

关键参数

与 @Cacheable 相同,但需确保 key 的生成逻辑与 @Cacheable 一致,否则可能导致缓存不一致。

示例

@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    // 更新数据库
    userRepository.update(user);
    return user; // 更新后的结果存入缓存
}

@CacheEvict

作用

删除指定缓存条目或清空整个缓存。支持在方法调用触发。

适用场景

  • 删除操作(例如删除用户后清除缓存)。
  • 数据变更后需要清理旧缓存(如批量更新后清空列表缓存)。

关键参数

  • allEntries:是否清空整个缓存(默认为 false,仅删除 key 对应的条目)。
  • beforeInvocation:是否在方法执行前删除缓存(默认为 false,方法执行后删除)。

示例

@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
    userRepository.deleteById(id);
}

// 清空整个缓存
@CacheEvict(value = "users", allEntries = true)
public void refreshAllUsers() {
    // 无需实际逻辑,仅触发缓存清理
}

三者的核心区别

注解是否执行方法体缓存行为典型场景
@Cacheable缓存命中时跳过读取缓存或写入新结果查询(幂等操作)
@CachePut始终执行强制更新缓存更新(非幂等)
@CacheEvict通常执行删除缓存条目或清空整个缓存删除或清理缓存

注意事项

键的一致性

@Cacheable 和 @CachePut 的 key 生成逻辑必须一致,否则更新后可能无法覆盖旧缓存。

事务与缓存的顺序

默认情况下,缓存操作在方法执行后触发。若方法有事务,需确保缓存操作在事务提交后执行(可通过 @Transactional 配置)。

条件过滤

使用 condition 和 unless 避免缓存无效数据(如 unless="#result == null")。

分布式锁

在高并发场景下,结合分布式锁(如 Redis 的 RedLock)避免缓存击穿或雪崩。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IDEA快速搭建jsp项目的图文教程

    IDEA快速搭建jsp项目的图文教程

    这篇文章主要介绍了IDEA快速搭建jsp项目的图文教程,本文分步骤通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 浅析Spring4新特性概述

    浅析Spring4新特性概述

    Spring 4.1并没有特别吸引眼球的地方,主要还是增强和一些依赖的版本升级。本文重点给大家介绍Spring4新特性概述,感兴趣的朋友一起看看吧
    2017-09-09
  • JVM与操作系统之间的关系详解

    JVM与操作系统之间的关系详解

    JVM与操作系统之间是依赖与被依赖的关系,JVM依赖于操作系统提供的资源和服务,同时JVM也起到了抽象与隔离的作用,为Java程序提供了一个统一的、与平台无关的运行环境,提高了Java程序的安全性
    2025-03-03
  • Java实现Html保存为.mhtml文件的代码逻辑

    Java实现Html保存为.mhtml文件的代码逻辑

    文章介绍了实现将HTML字符串保存为.mhtml文件的代码逻辑,包括通过URL和Cookie免密获取HTML字符串,将HTML中的图片、CSS、JS转换为base64字符串,删除不需要的布局和内容,最终将替换后的HTML保存为.mhtml文件,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Maven设置使用自定义的jar包到自己本地仓库

    Maven设置使用自定义的jar包到自己本地仓库

    今天小编就为大家分享一篇关于Maven设置使用自定义的jar包到自己本地仓库的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 详解Spring中的AOP及AspectJ五大通知注解

    详解Spring中的AOP及AspectJ五大通知注解

    这篇文章主要介绍了详解Spring中的AOP及AspectJ五大通知注解,AOP面向切面编程是一种新的方法论,是对传统OOP面向对象编程的补充,AOP 的主要编程对象是切面(aspect),切面模块化横切关注点,需要的朋友可以参考下
    2023-08-08
  • java版数独游戏核心算法(一)

    java版数独游戏核心算法(一)

    这篇文章主要为大家详细介绍了java版数独游戏的核心算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 基于Java实现抽奖系统

    基于Java实现抽奖系统

    这篇文章主要为大家详细介绍了基于Java实现抽奖系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java基础教程之实现接口

    Java基础教程之实现接口

    这篇文章主要介绍了Java基础教程之实现接口,也可以说是实施接口,因为接口只是定义,最终要实现它,本文就专门讲解接口的实现,需要的朋友可以参考下
    2014-08-08
  • SpringSecurity实现自定义登录接口的详细过程

    SpringSecurity实现自定义登录接口的详细过程

    本文详细介绍了如何使用SpringSecurity实现自定义登录接口,文章还涉及了对用户实体类的增强以满足详细信息的需求,适合需要深入了解和实现SpringSecurity自定义登录功能的开发者,感兴趣的朋友跟随小编一起看看吧
    2024-10-10

最新评论