Ключевые проблемы кэширования с Jcache - PullRequest
0 голосов
/ 24 мая 2018

Я использую JSR107 кеширование с Springboot.У меня есть следующий метод.

@CacheResult(cacheName = "books.byidAndCat")
public List<Book> getAllBooks(@CacheKey final String bookId, @CacheKey final BookCategory bookCat) {

return <<Make API calls and get actual books>>
}

Первый раз он выполняет реальные вызовы API, а второй раз загружает кеш без проблем.Я вижу следующую часть журнала.

Computed cache key SimpleKey [cb5bf774-24b4-41e5-b45c-2dd377493445,LT] for operation CacheResultOperation[CacheMethodDetails ...

Но проблема в том, что я хочу загрузить кеш, не совершая даже первого вызова API, просто необходимо заполнить кеш, как показано ниже.

String cacheKey  = SimpleKeyGenerator.generateKey(bookId, bookCategory).toString();     
        cacheManager.getCache("books.byidAndCat").put(cacheKey, deviceList);

Когда я проверяю, хэш-код кеширования одинаков в обоих случаях, но он выполняет вызовы API.Если хэш-код одинаков в обоих случаях, почему он выполняет вызовы API без учета кэша?

При отладке классов Spring было установлено, что org.springframework.cache.interceptor.SimpleKeyGenerator используется с генерацией ключа кэша, даже если @CacheResult существует. РЕДАКТИРОВАТЬ и усовершенствовать вопрос:

Кроме того, если getAllBooks имеет перегруженные методы, а затем вызывает этот кэшированный метод через отдельный перегруженный метод, в этом случае также не работает кэширование метода.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Как предположил @Henri, мы можем использовать кеш-память.Но для этого нам нужны методы.С помощью приведенного ниже мы можем обновить кэш, очень похожий на кэш-память,

// доступен перегруженный метод id и cat.

List<Object> bookIdCatCache = new ArrayList<>();
    bookIdCatCache.add(bookId);
    bookIdCatCache.add(deviceCat);
    Object bookIdCatCacheKey  = SimpleKeyGenerator.generateKey(bookIdCatCache.toArray(new Object[bookIdCatCache.size()]));
    cacheManager.getCache("books.byidAndCat").put(bookIdCatCacheKey , bookListWithIdAndCat);

// перегружен только метод id

List<Object> bookIdCache = new ArrayList<>();
        String nullKey          = null
        bookIdCache.add(bookId);
        bookIdCache.add(nullKey);
        Object bookIdCacheKey  = SimpleKeyGenerator.generateKey(bookIdCache.toArray(new Object[bookIdCache.size()]));
        cacheManager.getCache("books.byidAndCat").put(bookIdCacheKey , bookListWithId);

// Неправильно (Моя предыдущая реализация)

String cacheKey  = SimpleKeyGenerator.generateKey(bookId, bookCategory).toString();

// Правильно (Это с весны)

Object cacheKey  = SimpleKeyGenerator.generateKey(bookIdCatCache.toArray(new Object[bookIdCatCache.size()]));
0 голосов
/ 26 мая 2018

Я не эксперт по аннотациям JSR107 в контексте Spring.Вместо этого я использую аннотации Spring Cache.

При использовании JSR107 используется ключ GeneratedCacheKey.Так вот что вы должны положить в свой кеш.Не toString() этого.Обратите внимание, что SimpleKeyGenerator не возвращает GeneratedCacheKey.Он возвращает SimpleKey, который является ключом, используемым Spring при использовании его собственных аннотаций кэша вместо JSR-107.Для JSR-107 вам понадобится SimpleGeneratedCacheKey.

Затем, если вы хотите предварительно загрузить кэш, просто позвоните getAllBooks, прежде чем он понадобится.

Если вы хотите предварительно загрузить кэшкаким-то другим образом, @javax.cache.annotation.CachePut должен добиться цели.См. Его Javadoc для примера.

...