Java中的@Cacheable注解(指定缓存位置)的作用详解

Myovlmx 2024-12-30 08:20:22编程技术
439

在现代软件开发中,性能优化是一个至关重要的环节。缓存机制作为提升应用性能的有效手段之一,被广泛应用于各种场景中。在Java生态系统中,Spring框架提供了强大的缓存支持,其中@Cacheable注解是最常用的功能之一。本文将深入探讨@Cacheable注解的作用,特别是如何通过它来指定缓存位置,从而实现更高效的数据管理和性能优化。

一、@Cacheable的作用

1、缓存使用步骤:

@Cacheable这个注解,用它就是为了使用缓存的。所以我们可以先说一下缓存的使用步骤:

  • 开启基于注解的缓存,使用 @EnableCaching 标识在 SpringBoot 的主启动类上。

  • 标注缓存注解即可

 使用  @Cacheable  注解就可以将运行结果缓存,以后查询相同的数据,直接从缓存中取,不需要调用方法

2、@Cacheable作用:

把方法的返回值添加到Ehcache缓存中。

3、常用属性介绍:

(1)cacheNames/value 用来指定缓存组件的名字,将方法的返回结果放在哪个缓存中,可以是数组的方式,支持指定多个缓存

@Cacheable(cacheNames = "streamUrl", key = "#eventId", unless = "#result == null")
// 数组
@Cacheable(cacheNames = {"streamUrl", "test"}, key = "#eventId", unless = "#result == null")

(2)key:缓存数据时使用的 key。默认使用的是方法参数的值。可以使用 spEL 表达式去编写。

@Cacheable(cacheNames = "streamUrl", key = "#eventId + '[' + #id + ']'", unless = "#result == null")

(3)keyGenerator:key 的生成器,可以自己指定 key 的生成器,通过这个生成器来生成 key。

@Cacheable(value = "ip", keyGenerator = "cacheKeyGenerator")
public IPResponse query(String ip) {
return ipAPI.query(ip);
}

这样放入缓存中的 key 的生成规则就按照你自定义的 keyGenerator 来生成。

不过需要注意的是: @Cacheable 的属性,key 和 keyGenerator 使用的时候,一般二选一。 

(4)condition:符合条件的情况下才缓存。方法返回的数据要不要缓存,可以做一个动态判断

// 表示 id 大于 1 才进行缓存
@Cacheable(cacheNames = "streamUrl", condition = "#id > 1")

(5)unless:否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过  #result  获取方法结果)

(6)sync:是否使用异步模式。默认是方法执行完,以同步的方式将方法返回的结果存在缓存中。

4、spEL 编写 key

前面说过,缓存的 key 支持使用 spEL 表达式去编写,下面总结一下使用 spEL 去编写 key 可以用的一些元数据:

二、@CacheEvict的作用

@CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时,表示其中所有的方法的执行都会触发缓存的清除操作。

@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。

即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);

key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;

condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。

2、allEntries属性

allEntries是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,清除缓存中的所有元素,Spring Cache将忽略指定的key。

有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

3、beforeInvocation属性

清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素

Java中的@Cacheable注解(指定缓存位置)的作用详解

总结

通过本文的详细讲解,我们了解了@Cacheable注解在Java中的重要作用及其使用方法。特别是在指定缓存位置方面,@Cacheable注解提供了灵活且强大的功能,使得开发者可以根据具体需求选择合适的缓存策略。无论是使用内置的缓存管理器还是自定义缓存配置,@Cacheable注解都能帮助我们有效地减少重复计算和数据访问次数,从而显著提升应用的性能和响应速度。掌握这些技巧,将有助于我们在实际项目中更好地利用缓存机制,打造高性能的应用系统。

Java cacheable注解
THE END
蜜芽
故事不长,也不难讲,四字概括,毫无意义。

相关推荐

Java日志管理框架:Log4j、SLF4J、Logback对比与使用方法详解
java主流日志框架中,Log4j 1.x作为早期标准,Log4j 2.x通过重构实现性能飞跃,Logback作为Log4j的继承者以原生SLF4J支持成为主流选择,而SLF4J作为日志门面,通过抽象层实现...
2025-09-15 编程技术
533

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
本文聚焦Java与MySQL协同环境下的全文检索优化实践,从索引策略、查询调优、参数配置到Java层优化,深入解析如何释放全文检索的潜力,为高并发、大数据量场景提供稳定高效的搜...
2025-09-13 编程技术
512

JavaScript 中 instanceof 的作用及使用方法详解
在 JavaScript 的类型检查体系中,instanceof 是一个重要的操作符,用于判断一个对象是否属于某个构造函数的实例或其原型链上的类型。本文ZHANID工具网将系统讲解 instanceof...
2025-09-11 编程技术
503

Java与MySQL数据库连接实战:JDBC使用教程
JDBC(Java Database Connectivity)作为Java标准API,为开发者提供了统一的数据访问接口,使得Java程序能够无缝连接各类关系型数据库。本文ZHANID工具网将以MySQL数据库为例...
2025-09-11 编程技术
498

JavaScript出现“undefined is not a function”错误的解决方法
在JavaScript开发中,TypeError: undefined is not a function 是最常见的运行时错误之一,通常表示代码尝试调用一个未定义(undefined)的值作为函数。本文ZHANID工具网将从...
2025-09-10 编程技术
518

Java集合框架:List、Set、Map的使用与区别详解
Java集合框架是JDK中提供的核心数据结构库,为开发者提供了高效、安全、可扩展的集合操作能力。本文ZHANID工具网将系统解析List、Set、Map三大核心接口的实现类及其使用场景,...
2025-09-09 编程技术
481