咖啡因缓存:到期时立即重新加载

问题描述

我正在维护一个键值缓存,两者都是字符串。每个条目都有自己的到期时间。所以我有下面的工作代码,只要请求任何过期的密钥,它就会重新加载数据。 由于在我的情况下加载数据非常耗时并且来自外部服务,因此我认为每当到期时间过去时都需要立即在后台重新加载数据。所以当一个获取值的请求在过期后到来时,缓存中已经有一个刷新的数据。

我正在使用 Java 8,所以听说咖啡因调度程序可能无法正常工作。如果你有一个演示和任何例子,我可以在有或没有调度程序的情况下最好地实现这一点,那就太好了。 建议使用不同的缓存框架 - 也欢迎。

我当前的代码会在一段时间后使条目过期,但仅在请求数据并将外部服务调用时间加到 get 方法时才会重新加载。

caffeine.newBuilder().maximumSize(maxSize).recordStats().expireAfter(new Expiry<String,String>()
    {

        @Override
        public long expireAfterCreate(@NonNull String key,@NonNull String value,long currentTime)
        {
            long expiresInSec = //decide expiry time for each entry and return with some buffer;
            return TimeUnit.SECONDS.toNanos(expiresInSec - 5);
        }

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

        @Override
        public long expireAfterRead(@NonNull String key,@NonNegative long currentDuration)
        {
            return currentDuration;
        }

    }).build();

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...