Spring Boot Cache Bulk и индивидуальный доступ

Повторный доступ к БД для отдельных объектов намного медленнее, чем массовый выбор. Как кэшировать результат массового выбора в кеш, а затем обращаться к нему индивидуально?

Например, у меня есть сущность Employee:

public class Employee {
  private Integer id;
}

И у меня есть репозиторий, который может получить к нему доступ либо с помощью массового выбора, либо индивидуально по идентификатору:

public class EmployeeRepository {
  public Map<Integer, Employee> retrieveByEmployeeIds(List<Integer> ids) {
    // impl
  }
  public Employee retrieveByEmployeeId(Integer id) {
    // impl
  }
}

Как мне реализовать это так, чтобы при вызове retrieveByEmployeeId(Integer id) он проверял тот же кеш, что и retrieveByEmployeeIds(List<Integer> ids), и если он не существует, он делал вызов БД, а также снова сохранял этот кеш с идентификатором?


person George    schedule 25.02.2019    source источник


Ответы (1)


Я уже отвечал на подобные вопросы раньше, например, см. коллекция элементов/сущностей).

По сути, вы должны реализовать собственный CacheManager и Cache, два основных интерфейса, которые составляют основу абстракции кэша Spring, как описано здесь. Его можно даже расширить или делегировать существующему провайдеру кэширования, но вы должны «украсить» существующий функционал.

Ссылка, на которую я ссылался выше, также содержит примеры.

Надеюсь, это поможет вам понять, как работать с вашим конкретным UC.

person John Blum    schedule 26.02.2019
comment
Каково ваше мнение об этом дизайне? Это плохая практика делать что-то подобное? - person George; 26.02.2019
comment
Я не думаю, что это обязательно плохой дизайн. Я думаю, что это зависит от UC. Вы, безусловно, должны быть осторожны с запросами, которые вы выполняете, и результатами, которые вы кэшируете, поскольку вы можете довольно быстро исчерпать память, особенно в приложении с большим объемом. Мне нравится идея разрешить загрузку группы связанных сущностей одновременно, особенно если есть вероятность, что эти сущности будут работать дальше. Раньше я работал над системами определения приемлемости для государственного здравоохранения (например, CHIP, Medicaid и т. д.), и нередко приходилось загружать домохозяйства получателей, подавших заявки на медицинское обслуживание. ... - person John Blum; 26.02.2019
comment
Решение каждого члена семьи было уникальным, но также зависело от других членов семьи. Например, взрослый/родитель может быть отклонен, в то время как дети могут быть одобрены. В этом случае единицей было, например, домашнее хозяйство членов. - person John Blum; 26.02.2019