Семантика CacheLoader Google Guava loadAll() vs reload()

Две вещи, которые мне очень нравятся в CacheLoader в Guava 11 (спасибо, Google!) — это loadAll(), которая позволяет мне загружать несколько ключей одновременно, и reload( ), что позволяет мне асинхронно перезагружать ключ, когда он «устарел», но существует старое значение. Мне любопытно, как они работают вместе, поскольку reload() работает только с одной клавишей.

Конкретно, расширение примера из CachesExplained:

LoadingCache graphs = CacheBuilder.newBuilder()
   .maximumSize(1000)
   .refreshAfterWrite(1, TimeUnit.MINUTES)
   .build(
       new CacheLoader() {
         public Graph load(Key key) { // no checked exception
           return getGraphFromDatabase(key);
         }

         public Map loadAll(Iterable keys) {
           return getAllGraphsFromDatabase(keys);
         }

         public ListenableFuture reload(final Key key, Graph prevGraph) {
           if (neverNeedsRefresh(key)) {
             return Futures.immediateFuture(prevGraph);
           } else {
             // asynchronous!
             return ListenableFutureTask.create(new Callable() {
               public Graph call() {
                 return getGraphFromDatabase(key);
               }
             });
           }
         }
       });

...где "getAllGraphsFromDatabase()" выполняет агрегированный запрос к базе данных, а не длину (ключи) отдельных запросов.

Как эти два компонента LoadingCache работают вместе? Если некоторые ключи в моем запросе к getAll() отсутствуют в кеше, они загружаются как группа с помощью loadAll(), но если некоторые из них нуждаются в обновлении, загружаются ли они по отдельности с помощью load()? Если да, то есть ли планы по поддержке reloadAll()?

7
задан spitzanator 14 April 2012 в 12:43
поделиться