0

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

我正在使用 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, @NonNull String value, long currentTime,
                @NonNegative long currentDuration)
        {
            return currentDuration;
        }

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

    }).build();
4

0 回答 0