Spring Cache, как я должен проектировать кэши и ключи?

Я новичок в Spring Cache и использую Ehcache как Spring Cache implemention.
Я хочу знать о следующих паттернах: какой из них лучше и почему?

Шаблон 1: много различных классов используют один и тот же кэш, с различным ключевым префиксом.

@Cacheable(cacheNames = "myCache", key = "'user:'+#id")
public User findOne(int id) {
    return...
}

@Cacheable(cacheNames = "myCache", key = "'post:'+#id")
public Post findOne(int id) {
    return...
}

Шаблон 2: каждый класс имеет свой собственный кэш.

@Cacheable(cacheNames = "users", key = "#id")
public User findOne(int id) {
    return...
}
@Cacheable(cacheNames = "posts", key = "#id")
public Post findOne(int id) {
    return...
}

С Pattern 2, я должен настроить многие <cache/>в моем ehcache.XML.
Я не знаю, является ли кэш тяжеловесным компонентом или нет?
Вредно ли создание большого количества кэшей для производительности?

1 ответ

  1. Второе решение выглядит более эффективным и отслеживаемым и не подверженным ошибкам.

    В некоторых базах данных генерируемые идентификаторы для разных таблиц могут конфликтовать . Таким образом, для первого решения могут возникнуть проблемы, если один из сообщений имеет тот же идентификатор с одним из пользователей. В этой версии вам не понадобятся обходные пути, как в первом решении.

    Во-вторых, вы можете иметь разные атрибуты для разных типов объектов. Например; timeToLiveSeconds. Информация о пользователе может изменяться чаще, чем сообщения. (например, количество записей для пользователя и т.д.)

    В-третьих,maxEntriesLocalHeap. Сохранение последних объектов из разных типов в куче выглядит как лучший вариант.