文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

详解 Java @Cacheable 注解的运作机制究竟是怎样的?(Java @Cacheable注解的运作机制是什么)

极客之心

极客之心

2024-12-23 08:52

关注

在 Java 开发中,@Cacheable 注解是一个非常实用的注解,它主要用于方法级别的缓存控制。通过使用 @Cacheable 注解,我们可以轻松地在方法执行前先检查缓存中是否已经存在该方法的结果,如果存在则直接返回缓存中的结果,而不必再次执行该方法,从而提高系统的性能和响应速度。

一、@Cacheable 注解的基本用法

@Cacheable 注解通常用于方法上,它接受一个或多个参数,用于指定缓存的名称和其他相关配置。以下是一个简单的示例:

@Cacheable(value = "myCache", key = "#id")
public User getUserById(Long id) {
    // 从数据库或其他数据源中获取用户信息
    User user = userDao.findById(id);
    return user;
}

在上面的代码中,@Cacheable 注解指定了缓存的名称为 "myCache",并且使用 "#id" 作为缓存的键。当调用 getUserById 方法时,它会首先检查 "myCache" 缓存中是否已经存在键为 "id" 的缓存项。如果存在,则直接返回缓存中的用户信息;如果不存在,则执行方法体中的代码,从数据库中获取用户信息,并将其放入缓存中。

二、@Cacheable 注解的运作流程

  1. 方法调用前的检查:当调用被 @Cacheable 注解标记的方法时,Spring 会首先检查指定的缓存中是否已经存在该方法的缓存项。它会根据注解中指定的缓存名称和方法参数来计算缓存的键。
  2. 缓存命中:如果缓存中存在对应的缓存项,则直接返回缓存中的结果,而不会执行方法体中的代码。这可以避免重复执行耗时的数据库查询或其他计算操作,提高系统的性能。
  3. 缓存未命中:如果缓存中不存在对应的缓存项,则会执行方法体中的代码,并将方法的返回值放入缓存中。下次调用该方法时,如果缓存中已经存在对应的缓存项,则会直接返回缓存中的结果,而不会再次执行方法。
  4. 缓存的更新和清除:当被 @Cacheable 注解标记的方法的数据源发生变化时,需要手动更新或清除缓存中的相关项。可以通过调用 CacheManager 的相关方法来实现缓存的更新和清除操作。

三、@Cacheable 注解的配置选项

  1. value:指定缓存的名称,必填项。
  2. key:指定缓存的键,可以是一个 SpEL 表达式,用于根据方法参数计算缓存的键。默认情况下,使用方法的所有参数作为缓存的键。
  3. condition:指定一个 SpEL 表达式,用于在方法调用前判断是否应该缓存该方法的结果。只有当条件为 true 时,才会将方法的结果放入缓存中。
  4. unless:指定一个 SpEL 表达式,用于在方法调用后判断是否应该清除缓存中的相关项。只有当条件为 true 时,才会清除缓存中的相关项。
  5. sync:指定是否以同步方式执行方法。如果设置为 true,则在执行方法时会获取锁,以确保线程安全。默认情况下,以异步方式执行方法。

四、@Cacheable 注解的示例应用

以下是一个更复杂的示例,演示了如何使用 @Cacheable 注解来缓存用户信息,并根据条件和 unless 表达式来控制缓存的行为:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private CacheManager cacheManager;

    @Cacheable(value = "userCache", key = "#id", condition = "#id!= null", unless = "#result == null")
    public User getUserById(Long id) {
        User user = userRepository.findById(id);
        return user;
    }

    public void updateUser(User user) {
        userRepository.save(user);
        cacheManager.getCache("userCache").evict("userCache:" + user.getId());
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
        cacheManager.getCache("userCache").evict("userCache:" + id);
    }
}

在上面的代码中,getUserById 方法使用 @Cacheable 注解来缓存用户信息。condition 表达式确保只有当 id 不为 null 时才会缓存结果,unless 表达式确保只有当方法的返回值为 null 时才会清除缓存中的相关项。updateUserdeleteUser 方法用于更新和删除用户信息,并在更新或删除后清除缓存中的相关项。

五、总结

@Cacheable 注解是 Spring 框架中用于方法级别的缓存控制的重要注解。它可以帮助我们轻松地实现方法的缓存功能,提高系统的性能和响应速度。通过合理配置 @Cacheable 注解的各种选项,我们可以根据具体的业务需求来控制缓存的行为,例如缓存的名称、键、条件和清除策略等。在使用 @Cacheable 注解时,需要注意缓存的更新和清除操作,以确保缓存中的数据始终是最新的。

总之,掌握 @Cacheable 注解的运作机制和使用方法对于提高 Java 应用的性能和开发效率具有重要意义。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯