Google番石榴LoadingCache:何时应调用cache.cleanup()

时间:2019-03-19 06:20:28

标签: java multithreading guava

我在项目中使用LoadingCache。我为缓存配置了RemovalListener和CahceLoader。

    LoadingCache<Key, value> cache = cache = (LoadingCache<Key, value>) CacheBuilder
            .newBuilder().initialCapacity(50).maximumSize(500).expireAfterAccess(4, HOURS)
            .removalListener(new RemovalHander())
            .build(new CacheLoader<Key, value>() {
                @Override
                public Value load(Key request) {
                    return loadCache(request);
                }

            });

在以下情况下,我遇到了与此缓存并发的问题:

  • 在请求Key1时,将使用Value1填充缓存
  • 在接下来的4个小时内无法访问Key1的缓存
  • 经过4个小时,密钥1被标记为已过期
  • 4小时后,请求访问Key1
  • 在请求Key1(在请求线程中收到)之后4 小时,LoadingCache发现Key1已过期,因此启动了一个新线程(调用 它 cleanup-thread)来清理Key1的缓存,并在 request- 线程,它尝试为Key1加载新数据
  • 由于对同一密钥(即Key1)执行了两种删除/提取操作, 请求线程发现清理线程时已经存在一个条目 正在删除数据。

因此,简而言之,RemovalHander与CacheLoader争用Key1。 我想避免上述情况,并考虑调用cleanup()的{​​{1}}方法。

请您提出以下几点建议:

  1. 何时应调用cleanup()方法?定期使用某些 SchedulerService 还是每次请求缓存中的条目?
  2. 有没有更好的方法来解决上述问题?
  3. 他们是GuavaCache的更好替代品吗?

0 个答案:

没有答案