在 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 的缓存功能!如果有任何疑问或建议,欢迎在评论区留言。

相关推荐
学习编程的Kitty2 小时前
JavaEE初阶——多线程(5)单例模式和阻塞队列
java·开发语言·单例模式
m0_372257022 小时前
项目下有多个模块,每个模块有pom文件,是怎么继承的
java·tomcat
oak隔壁找我3 小时前
Spring AI 入门教程,使用Ollama本地模型集成,实现对话记忆功能。
java·人工智能·后端
懒羊羊不懒@3 小时前
JavaSe—Stream流☆
java·开发语言·数据结构
郝开3 小时前
最终 2.x 系列版本)2 - 框架搭建:pom配置;多环境配置文件配置;多环境数据源配置;测试 / 生产多环境数据源配置
java·spring boot·后端
Homeey3 小时前
深入理解ThreadLocal:从原理到架构实践的全面解析
java·后端
ANGLAL3 小时前
27.短链系统
java
Lisonseekpan3 小时前
Git 命令大全:从基础到高级操作
java·git·后端·github·团队开发
CodeCraft Studio4 小时前
国产化Excel处理控件Spire.XLS教程:使用Java将CSV转换为PDF(含格式设置)
java·pdf·excel·spire.xls·文档格式转换·csv转pdf
乐悠小码4 小时前
Java设计模式精讲---04原型模式
java·设计模式·原型模式