gpt4 book ai didi

java - 更改 EHCache 3 中各个条目的 TTL

转载 作者:行者123 更新时间:2023-11-30 06:48:17 26 4
gpt4 key购买 nike

在 EHCache 2.x 中,可以设置缓存中单个条目的生存时间,例如:

Element dependentElement = cache.get(key);
long lastAccessTime = dependentElement.getLastAccessTime();
long creationTime = dependentElement.getCreationTime();
int timeToLive = lastAccessTime == 0 ? 300 : (int)
(lastAccessTime - creationTime) / 1000 + 300;
timeToLive += 2;
dependentElement.setTimeToLive(timeToLive);

这将更新单个项目的 TTL,从而使其在缓存中保留更长时间。

在 EHCache 3.x 中,这似乎不再可能在单个缓存条目的基础上进行。读完Migration Guide后和 this question ,在我看来这个功能不能直接迁移。

指南告诉我们,为了修改 TTL,必须实现一个接口(interface):

CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, 
String.class, ResourcePoolsBuilder
.withExpiry(new Expiry<Long, String>() {
@Override
public Duration getExpiryForCreation(Long key, String value) {
return getTimeToLiveDuration(key, value);
}

@Override
public Duration getExpiryForAccess(Long key, ValueSupplier<? extends String> value) {
return null; // Keeping the existing expiry
}

@Override
public Duration getExpiryForUpdate(Long key, ValueSupplier<? extends String> oldValue, String newValue) {
return null; // Keeping the existing expiry
}
});

然后将此配置添加到要初始化的缓存中。但是,由于它是缓存级扩展点,您似乎永远无法保证为您想要更改的实际条目触发这些方法?

看看 EHCache 3 的内部结构,似乎旧的 net.sf.ehcache.Element 被抽象出来并更改为 ValueHolder 并且无法再访问此内容。

那么,问题是:我们如何在 EHCache 3.x 中实现相同的行为?

最佳答案

只有在创建访问更新条目时才能修改过期时间。

现在,根据您的具体要求,您可以在 getExpiryForAccess 上实现特定逻辑并访问映射以获取更新的到期时间。但是,您无法区分常规访问和应更新过期时间的访问。无论如何,我不建议进行这样的有状态过期计算。

可能有其他方法可以通过完全更改缓存设计来支持您的用例,但这超出了本问题的范围。

关于java - 更改 EHCache 3 中各个条目的 TTL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43306560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com