У меня есть следующие проблемы кэширования:Несколько операций 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()
непосредственно. Это имеет преимущество безопасности добавленного типа за счет элегантности
Какое решение лучше? Или есть третий супер или подход?