Использование кэша в Springboot


Введение

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

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

Поэтому использование кэша — это механизм повышения производительности нашего сервиса с использованием временной памяти, которую наш развернутый сервис имеет внутри.

Кэш в Springboot

Базовое использование кэша в Springboot может быть реализовано очень простым способом. В этой статье я собираюсь описать очень простое использование, видя уже в чем-то базовом, как это, увеличение производительности нашего приложения.

Использование кэша

Для того чтобы начать реализацию нашего кэша, мы будем использовать аннотацию @Cacheable, которую мы используем в Spring для маркировки функций, которые мы хотим кэшировать в памяти. Это означает, что при первом вызове они будут хранить результат в памяти, а в последующие разы они будут использовать ту же память.

Обычно мы разрабатываем это на уровне сервиса, но мы можем реализовать это и на уровне хранилища.

    @Cacheable("books")
    override fun getBooks(): List<Book>? {
         println("Service layer. getBooks")
         Thread.sleep(2000L)
         return repo.findAll()
    }
Войдите в полноэкранный режим Выход из полноэкранного режима

Имя, которое мы присваиваем, очень важно, так как это ключ, с помощью которого мы сохраняем результат в памяти.

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

    @Cacheable("book", key = "#id")
    override fun getBookById(id: Long): Book? {
        println("Service layer. getBookById")
        Thread.sleep(2000L)
        return repo.findById(id).orElseGet(null)
    }
Войдите в полноэкранный режим Выход из полноэкранного режима

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

После того, как мы пометили наши методы @Cacheable, нам остается пометить наше приложение @EnableCaching, чтобы сообщить Spring, что мы собираемся использовать кэш в приложении:

@SpringBootApplication
@EnableCaching
class CacheServiceApplication : CommandLineRunner {
      ......
}
Войдите в полноэкранный режим Выход из полноэкранного режима

И это все… ничего больше! Вот так просто наш кэш будет реализован в нашем сервисе. Давайте пройдемся по тестам.

Мы делаем первый звонок по списку книг:

Мы видим, как ответ получен через 2 секунды, но если мы сделаем это снова… волшебство!

Мы видим, что он воспользовался кэшем, и ответ приходит мгновенно.

То же самое происходит и с вызовом getBookById:

И во втором звонке:

Выводы

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

Код проекта можно найти здесь

Увидимся в следующий раз!

Оцените статью
devanswers.ru
Добавить комментарий