咖啡因的生成器函数参数的目的?

时间:2018-09-08 11:43:50

标签: java caffeine

Caffeine的新手,我显然错过了一些超级基础知识。我看到的所有基本用法示例如下所示:

LoadingCache<String,Fizzbuzz> fizzbuzzes = Caffeine.newBuilder()
    .maximumSize(100)
    .expireAfterWrite(10, TimeUnit.DAYS)
    .build(k -> fetchFizzbuzzes());

我正在苦苦挣扎的是fetchFizzbuzzes()函数所扮演的角色:

  • 它是用来填充初始缓存的吗?
  • 万一缓存中不存在密钥,它是否用作某种后备?
  • 还有什么?

1 个答案:

答案 0 :(得分:4)

实际上,这是构建器中最重要的部分。传递给build(CacheLoader)方法的函数采用一个键并计算该键的值。如果当前在缓存中没有此键的值,则调用此函数。计算的值将随后添加到缓存中。还有一种build()方法也没有参数,如果您要手动检查缓存中是否存在元素并也手动添加它们,可以使用该方法。

但是,您的示例没有太多意义,因为fetchFizzbuzzes()方法没有参数。也就是说-在没有副作用的情况下-所有键k都可能返回相同的值。

采用以下示例:

LoadingCache<String,Fizzbuzz> fizzbuzzes = Caffeine.newBuilder()
    .maximumSize(100)
    .expireAfterWrite(10, TimeUnit.DAYS)
    .build(key -> fetchFizzbuzzes(key));
fizzbuzzes.get("myKey"); // will automatically invoke fetchFizzbuzzes with 'myKey' as argument
fizzbuzzes.get("myKey"); // fetchFizzbuzzes won't be called as return value from previous call is added to the cache automatically


Cache<String, Fizzbuzz> fizzbuzzesManual = Caffeine.newBuilder()
     .maximumSize(100)
     .expireAfterWrite(10, TimeUnit.DAYS)
     .build();
fizzbuzzesManual.getIfPresent("myKey"); // will return null as no element for 'myKey' was added to the cache before

有关其他详细信息,请参见Caffeine wiki