在特定时间强制刷新番石榴缓存

Forcing refresh at specific time Guava Cache

我试图让这个缓存在每天凌晨 3 点刷新。问题是用户必须等待很长时间才能让缓存预热。所以我宁愿它在一夜之间刷新并准备在早上快速访问 UI.

    return CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterAccess(1, TimeUnit.DAYS)
            .build(new CacheLoader<String, Long>() {
                @Override
                public Long load(String key)
                        throws Exception {
                        return db.getMetrics(key);
                }
            });

我希望能够在缓存中提供一组固定的键,以便在凌晨 3 点刷新。

我读了 Google documentation 但它似乎只刷新已经加载到缓存中的数据。

TL;DR - 希望在一天中的特定时间用一组固定的键预热缓存

据我所知,Guava 在某个预定时间没有为一组键的 "freshen"/"warm" 值内置任何内容,但您可以轻松地自行完成.

预热缓存

您只需在 LoadingCache<String, Long> 实例上调用 getAll(Iterable) 即可预热现金。例如

loadingCache.getAll(keysToFreshen);

其中 keysToFreshenIterable<String> 的一个实例,其中包含您要在凌晨 3 点(或任何时候)更新的密钥(例如 Set<String>)。

运行 带有 Job/Task 调度程序的缓存预热代码

您现在只需 运行 loadingCache.getAll(keysToFreshen) 使用工具安排 job/task 凌晨 3 点。您可以使用 Quartz, Spring, Java's ScheduledExecutorService (see here 作为示例)等