Spring кэш/jsr107: аргумент списка/коллекции как часть ключаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring кэш/jsr107: аргумент списка/коллекции как часть ключа

Сообщение Anonymous »

У меня есть служба, которая вызывает внешнюю систему для получения некоторых объектов по их внешнему идентификатору, а также для отправки их обратно на обновление. Вместо извлечения объектов один за другим существуют методы более общего назначения:

Код: Выделить всё

public interface ExternalSystem {
List getObjects(List externalIds);

void updateObjects(List updates);
}
Я бы хотел поместить кеш поверх вызовов ExternalSystem, потому что они довольно дорогие.

В реализации сервиса я могу просто поместить пружинные аннотации:

Код: Выделить всё

@Cacheable("cache-external")
List getObjects(List externalIds) {}

@CacheEvict(cacheNames="cache-external", allEntries=true)
void updateObjects(List updates);
Однако такой кеш будет вести себя очень плохо, если у меня много пересечений между внешними идентификаторами, т.е.
  • Call#1 getObjects([1,2,3,4]) -> кеш, помещенный по ключу [1,2,3,4]
  • Call#2 getObjects([1,2,3,4,5]) -> кеш, помещенный клавишей [1,2,3,4,5]
  • Call#3 getObjects([6,7,8,9]) -> кеш, помещенный клавишей [6,7,8,9]
  • Call#4 updateObjects(1) -> удалить все кеши, но третий кеш не содержит 3
Итак, вопрос в том, как реализовать пользовательская стратегия (я предполагаю, что это невозможно из коробки), которая будет удалять только те записи, которые действительно должны быть удалены, и сделает ключи таким образом, чтобы пересекающиеся объекты извлекались из кеша?

Upd. Я нашел два похожих вопроса:
  • spring-cache-abstraction-with-multi-value-queries
  • using-spring-cache-on-methods-that-take-an-array-or-collection
  • spring-cacheable-methods-with-lists
Upd2.
Вот что-то похожее на то, что я хочу, за исключением того, что я буду помещать в кеш пары String и ExternalDTO для каждого элемента в коллекция.
Кэширование-списка-в-список на уровне элемента
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»