java 咖啡因缓存-指定条目的过期时间

gpnt7bae  于 2023-02-07  发布在  Java
关注(0)|答案(2)|浏览(381)

我试图进一步理解caffeine cache,我想知道是否有一种方法可以为该高速缓存中填充的条目指定超时,但对其余记录没有基于时间的到期。
基本上,我希望有以下界面:
put(key, value, timeToExpiry)//输入具有指定timeToExpiry的键和值
put(key, value)//输入不带timeToExpiry的键值
我可以编写接口和管道,但我想了解如何配置咖啡因以满足上述两个需求,我也愿意拥有两个独立的咖啡因缓存示例。

e5njpo68

e5njpo681#

这可以通过使用自定义过期策略并利用无法到达的持续时间来完成。最长持续时间为Long.MAX_VALUE,即292年(以纳秒为单位)。假设您的记录在过期时保持不变,则您可以该高速缓存配置为,

LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
    .expireAfter(new Expiry<Key, Graph>() {
      public long expireAfterCreate(Key key, Graph graph, long currentTime) {
        if (graph.getExpiresOn() == null) {
          return Long.MAX_VALUE;
        }
        long seconds = graph.getExpiresOn()
            .minus(System.currentTimeMillis(), MILLIS)
            .toEpochSecond();
        return TimeUnit.SECONDS.toNanos(seconds);
      }
      public long expireAfterUpdate(Key key, Graph graph, 
          long currentTime, long currentDuration) {
        return currentDuration;
      }
      public long expireAfterRead(Key key, Graph graph,
          long currentTime, long currentDuration) {
        return currentDuration;
      }
    })
    .build(key -> createExpensiveGraph(key));
mzillmmw

mzillmmw2#

我目前正在研究这个主题,我受到了这几篇文章的启发,我与您分享了对我来说很有效的解决方案。

@EnableCaching
@Configuration
public class CaffeineConfiguration {

  @Autowired
  private ApplicationProperties applicationProperties;

  @Bean
  public Caffeine caffeineConfig() {
    return Caffeine.newBuilder().expireAfter(new Expiry<String, Object>() {
      @Override
      public long expireAfterCreate(String key, Object value, long currentTime) {
        long customExpiry = applicationProperties.getCache().getEhcache().getTimeToLiveSeconds();
        if (key.startsWith("PREFIX")) {
          customExpiry = 60;
        }
        return TimeUnit.SECONDS.toNanos(customExpiry);
      }

      @Override
      public long expireAfterUpdate(String key, Object value, long currentTime,
          long currentDuration) {
        return currentDuration;
      }

      @Override
      public long expireAfterRead(String key, Object value, long currentTime,
          long currentDuration) {
        return currentDuration;
      }
    });

  }

  @Bean
  public CacheManager cacheManager(Caffeine caffeine) {
    CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
    caffeineCacheManager.getCache(PROVIDER_RESPONSE);
    caffeineCacheManager.getCache(BCU_RESPONSE);
    caffeineCacheManager.setCaffeine(caffeine);
    return caffeineCacheManager;
  }

}

相关问题