2016-12-20 11 views
0

У меня есть следующие проблемы кэширования:Несколько операций CachePut по методу Призыва в Spring Кэширование

// imagine we have a method that performs a long running batch query List<Record> fetchRecords(List<String> recordKeys)

Мы хотели бы кэшировать результаты этого длительных операций с использованием индивидуального записи ключа как кэш ключ, а не весь список

Преимущество этого результата очевидно. А именно, при следующем вызове fetchRecords(overlappingRecordKeys) длинный пакетный запрос будет включать только те ключи, которые ранее не были включены. Это преимущество, которое мы не получаем, проверяя равенство по всему List.

Это не может быть решен с помощью keyGenerator перехватчика, как этот механизм только позволит нам вернуть один ключ кэша на один вызов метода

Каков наилучший подход для решения этой проблемы? Я могу думать о двух решений

Решение 1

Создать CachingAspect

// pseudo code 
@Aspect 
class CachingAspect { 

    CacheManager mgr = ... 

    @Around("somePointcut") 
    void checkCache(ProceedingPointCut pc) { 

    // grab args from 'pc' which is of type List<String> 
    // check against 'mgr', modify the argument to exclude those records already in cache 
    // capture the output (i.e. new records from long-running operation), append with records retrieved from cache, return the union 

    } 
} 

Решение 2

Та же идея, что и выше, без АОП (поместить код в fetchRecords() непосредственно. Это имеет преимущество безопасности добавленного типа за счет элегантности

Какое решение лучше? Или есть третий супер или подход?

ответ

0

Вопрос о массовых операциях и абстракции кэш-памяти весны возникает довольно часто. Это не распространяется.

... ценою элегантности

Ну, элегантность это дело вкуса. Стремление к обоим, элегантность (через АОП) и эффективность, вероятно, являются предметом головных болей;)

Прямое решение без аннотации и является сквозной конфигурацией с загрузчиком кеша. Кэш JCache/JSR107, например, предоставляет вам операцию Cache.getAll(keys), о которой вы просите.

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

 Смежные вопросы

  • Нет связанных вопросов^_^