为@Cacheable设置TTL – Spring

本文介绍了如何在Spring中为@Cacheable注解的缓存设置生存时间(TTL)。由于Spring本身不直接支持配置TTL,作者通过结合@Scheduled注解和动态获取环境值的方法实现了这一目标。文章详细讲解了遇到的问题以及解决方案,包括使用@Scheduled的fixedDelayString元素和实现自定义的CacheResolver来动态填充缓存名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天,我被要求为应用程序正在使用的某些键设置缓存的过期时间,因此我Swift开始寻找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的bug的注释后,提示给我一个提示:

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

正如错误所言,要利用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上找到

翻译自: https://www.javacodegeeks.com/2017/01/setting-ttl-cacheable-spring.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值