You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Guava Cache一对多键值场景下的数据加载问题咨询

解决Guava Cache一对多数据更新的几种方案
  • 主动触发缓存更新
    当数据库新增数据后,在写操作的代码里直接更新缓存:要么调用cache.put("key1", 更新后的完整List)覆盖旧值;要么调用cache.invalidate("key1")删掉旧缓存,下次查询时LoadingCache会自动从数据库拉取最新数据。这种方式简单直接,适合能控制数据写入逻辑的场景。

  • 配置自动刷新规则
    初始化LoadingCache时,用refreshAfterWrite()设置自动刷新的时间阈值,示例代码如下:

    LoadingCache<String, List<String>> cache = CacheBuilder.newBuilder()
        .refreshAfterWrite(5, TimeUnit.MINUTES) // 缓存写入后5分钟,再次访问时自动刷新
        .build(new CacheLoader<String, List<String>>() {
            @Override
            public List<String> load(String key) throws Exception {
                // 从数据库加载对应key的最新全量数据
                return getFullDataFromDB(key);
            }
        });
    

    这个机制是异步刷新的,查询时如果缓存过期,会先返回旧数据,后台异步加载新数据更新缓存,不会阻塞当前请求。

  • 手动触发异步刷新
    如果不想等自动刷新的时间,可主动调用cache.refresh("key1"),这个方法会异步调用Loader重新加载该key的最新数据,刷新过程中旧缓存依然可用,不会出现查询空数据的情况。

  • 自定义增量刷新逻辑(进阶)
    重写CacheLoader的reload方法,实现增量更新而非全量加载,比如只拉取数据库中新增的数据合并到旧缓存里:

    @Override
    public ListenableFuture<List<String>> reload(String key, List<String> oldValue) throws Exception {
        // 假设数据库能根据最后更新时间查询新增数据
        List<String> newAddedValues = getNewDataFromDB(key, getLastUpdateTime(oldValue));
        oldValue.addAll(newAddedValues);
        return Futures.immediateFuture(oldValue);
    }
    

    这种方式适合数据量大、全量加载开销高的场景,但需要数据库支持增量查询的能力。

内容的提问来源于stack exchange,提问作者Ben Weis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 11:14:56