在 Spring 中使用 @Cacheable 和 @CacheEvict

缓存是提高性能和用户体验的重要工具。Spring Framework 提供了强大的缓存抽象,使得缓存的使用变得简单高效。本文将介绍两个核心注解:@Cacheable@CacheEvict,并讨论它们的用法和注意事项。

1. @Cacheable

@Cacheable 注解用于标记方法的返回值应该被缓存。当方法被调用时,Spring 会检查缓存中是否已有结果,如果有,则直接返回缓存中的结果;如果没有,则调用方法并将结果存入缓存。

用法示例:

java 复制代码
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public User findUserById(Long id) {
        // 模拟从数据库查询
        simulateSlowService();
        return new User(id, "User" + id);
    }

    private void simulateSlowService() {
        try {
            Thread.sleep(3000); // 模拟延迟
        } catch (InterruptedException e) {
            throw new IllegalStateException(e);
        }
    }
}

注意事项:

  • 需要配置缓存管理器(如 Ehcache、Redis 等)。
  • 适用于读取操作,避免缓存更新或删除带来的复杂性。
2. @CacheEvict

@CacheEvict 注解用于从缓存中移除一条或多条数据。通常在数据被修改或删除时使用,以保持缓存的一致性。

用法示例:

java 复制代码
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @CacheEvict(value = "users", key = "#id")
    public void deleteUserById(Long id) {
        // 删除用户逻辑
    }
}

注意事项:

  • 可以使用 allEntries = true 参数,清空整个缓存。
  • 适用于删除或更新操作,确保缓存数据的准确性。
3. 结合使用

@Cacheable@CacheEvict 常常结合使用。例如,当更新用户信息时,可以先清除缓存,然后再更新数据库。

示例:

java 复制代码
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Cacheable("users")
    public User findUserById(Long id) {
        // 从数据库查询用户
    }

    @CacheEvict(value = "users", key = "#user.id")
    public void updateUser(User user) {
        // 更新用户逻辑
    }
}
4. 总结

使用 @Cacheable@CacheEvict 注解可以极大地简化缓存管理,使得开发人员可以专注于业务逻辑。通过合理地使用这两个注解,能够提高应用的性能和用户体验。在实际应用中,确保缓存的一致性和正确性是至关重要的。

希望本文能帮助你更好地理解和使用 Spring 的缓存功能!如果有任何疑问或建议,欢迎在评论区留言。

相关推荐
huangdong_1 天前
电商平台图片URL原图转换技术深度解析:从缩略图到高清原图的完整方案
java·后端·spring
記億揺晃着的那天1 天前
Java 调用外部 Go 程序的实践:ProcessBuilder 在生产环境中的应用
java·golang·processbuilder
JAVA面经实录9171 天前
Java 数据结构与算法 (终极完整学习文档)
java·数据结构·算法
JAVA面经实录9171 天前
操作系统面试题
java·服务器·数据库·计算机网络·面试
一杯奶茶¥1 天前
基于springboot的失物招领管理系统带万字文档 校园失物招领管理系统 失物认领管理系统java springboot vue
java·vue.js·spring boot·java项目
不能只会打代码1 天前
边缘视频分析平台的架构设计与性能优化——从750ms到190ms的调优之路
java·spring boot·redis·性能优化·边缘计算·物联网竞赛
小刘|1 天前
Spring AI Alibaba 集成和风天气 API 实战
java·服务器·前端
KANGBboy1 天前
java知识五(继承)
java·开发语言
AI人工智能+电脑小能手1 天前
【大白话说Java面试题 第117题】【并发篇】第17题:线程有几种状态,之间如何转换?
java·开发语言·面试
DIY源码阁1 天前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse