gpt4 book ai didi

java - 具有复杂条件驱逐的缓存

转载 作者:行者123 更新时间:2023-12-04 07:15:59 25 4
gpt4 key购买 nike

我正在尝试使用 caffeinespring-boot-starter-cache 来实现以下缓存逻辑:

  • 如果 到期时间 已通过 条件(需要计算和 I/O)是 评估为 40 并强制更新数据
  • 如果 过期时间 已通过 条件(这需要计算和 I/O)是 评估为 FALSE5 缓存数据,然后从无效的值 60x1 检索 0x10 缓存 67919
  • 如果 到期时间 而不是 传递,则从缓存中检索值。

  • 我根据本指南工作:
    https://www.baeldung.com/spring-boot-caffeine-cache
    我尝试了使用 @CachePut@CacheEvict@Cacheable 在对象 I;m 缓存的 getter 方法上的各种方法,但核心问题是我需要用过期时间和另一个控制来限制驱逐,但这些注释是否不能驱逐与否...也许这可以使用 Scheduler 来完成?

    最佳答案

    我认为您正在寻找 refreshAfterWrite并覆盖 CacheLoader.reload(K, V) .
    这是解释细节的帖子:https://github.com/ben-manes/caffeine/wiki/Refresh
    您的案例的实现将类似于:

    @Log4j2
    @Configuration
    public class CacheConfig {

    @Bean
    public Cache<String,Item> caffeineConfig() {
    return Caffeine.newBuilder()
    .refreshAfterWrite(10, TimeUnit.SECONDS)
    .build(new ConditionalCacheLoader<>(this::shouldReload, this::load));
    }

    private Item load(String key){
    //load the item
    return null;
    }

    private boolean shouldReload(Item oldValue){
    //your condition logic here
    return true;
    }


    private static class Item{
    // the item value can contain any data
    }

    private static class ConditionalCacheLoader<K,V> implements CacheLoader<K,V>{
    private final Predicate<V> shouldReload;

    private final Function<K,V> load;

    protected ConditionalCacheLoader(Predicate<V> shouldReload, Function<K, V> load) {
    this.shouldReload = shouldReload;
    this.load = load;
    }

    @Override
    public V load(K key) throws Exception{
    return load.apply(key);
    }

    @Override
    public V reload(K key, V oldValue) throws Exception {
    if (shouldReload.test(oldValue)){
    return load(key);
    }else {
    return oldValue;
    }
    }
    }
    }

    关于java - 具有复杂条件驱逐的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68759508/

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