надо пойти в кэш, проверить есть ли там данные, если нет, то пойти в БД, и в итоге взять, оттуда где лежит. В плане организации логики кэш у нас является отдельной инфраструктурной деталью, либо же часть БД? То есть обращение к кэшу у нас должно быть скрыто за гейтвеем базы? Или же отдельно свой гейтвей?
Например:
post, err := controller.db.GetPostById(params.PostId)
if err != nil {
return result, errors.InternalError
}
И логика обращения к кэшу скрыта в методе GetPostById, либо же
post, err := controller.cache.GetPostById(params.PostId)
if err != nil || !post.Exists() {
post, err = controller.db.GetPostById(params.PostId)
if err != nil {
return result, errors.InternalError
}
}
Явно показываем в юзкейсе, что обращаемся к кэшу
Реализации кеша и бд могут имплиментировать один интерфейс. Этим интерфейсом и пользуйся в сервисах.
Я обычно в репозитории делаю. И тебе советую вынести работу с базой в слой репозитория и там всё разруливать
Репозиторий доступа к базе не должен включать кэш, это отдельная сущность. Надо кэшировать, делай прокси с интерфейсом репозитория который будет кешировать и при необходимости обращаться к репозиторию БД. Компоненты будут независимы и можно будет исключать при необходимости кешь или заменять репозиторий: не меняя другого кода.
Обсуждают сегодня