为@Cacheable 设置 TTL – Spring

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(578)   2023-09-08 09:14:53

今天我被要求为我们的应用程序使用的一些键设置缓存的过期时间,所以我很快开始寻找 Spring @Cacheable 符号提供的所有选项来设置过期时间或生活的时间。由于 Spring 不提供任何可配置的选项来实现它,我构建了一个利用 @Scheduled 具有固定延迟的注释的实现,如下所示:

@CacheEvict(allEntries = true, cacheNames = { "EMPLOYEE_", "MANAGER_" })
@Scheduled(fixedDelay = 30000)
public void cacheEvict() {
}

现在的问题是我希望缓存名称以及固定延迟时间段应该从环境值而不是硬编码值中填充。为了达到同样的目的,我在类级别声明了变量(从属性文件填充)并填充了注释中的键值,这使得 IDE 抱怨值必须是常量,如下所示:

“注释属性 CacheEvict.cacheNames 的值必须是常量表达式”

然后我开始寻找其他选项来从环境中获取键的值,并遇到了 @Scheduled 符号的 fixedDelayString 元素,这帮助我实现了我的目标,如下所示:

@Scheduled(fixedDelayString = "${couchbase.cache.flush.fixed.delay}")
public void cacheEvict() {
}

也在为 @CacheEvict 注释寻找类似的元素,不幸的是,在阅读了关于错误 SPR-10778 的评论后给我提示,它说:

“缓存抽象现在支持 CacheResolver 抽象,它可以在全局、每个类和/或特定操作上指定。 CacheResolver 使您能够计算要在代码中使用的缓存,因此您拥有所需的所有灵活性。”

由于 bug 说要使用 CacheResolver 来动态填充缓存名称,我使用 AbstractCacheResolver 实现它来从环境中获取缓存名称,如下所示:

@Value("#{'${couchbase.cache.flush}'}")
private String couchbaseCacheFlush;

@Bean(name = "customCacheResolver")
	public CacheResolver cacheResolver() {
		CacheResolver cacheResolver = new AbstractCacheResolver(cacheManager()) {
			@Override
			protected Collection<String> getCacheNames(
					CacheOperationInvocationContext<?> context) {
				return Arrays.asList(couchbaseCacheFlush.split(","));
			}
		};
		return cacheResolver;
	}

修改 cacheEvict() 以使用自定义缓存解析器而不是缓存名称完成我当天的任务,如下所示:

@CacheEvict(allEntries = true, cacheResolver = "customCacheResolver")
@Scheduled(fixedDelayString = "${couchbase.cache.flush.fixed.delay}")
public void cacheEvict() {
}

github 上提供了完整的源代码。

标签2: Java教程
地址:https://www.cundage.com/article/jcg-setting-ttl-cacheable-spring.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...