Введение
Чтобы представить себя в контексте, иногда в проекте нам нужно сделать серию обращений к нашему бэкенду в очень повторяющемся режиме. Кроме того, этот вызов очень мало изменяется на уровне базы данных. Другими словами, мы делаем звонок и запрашиваем базу данных или внешнюю службу практически об одном и том же каждый раз и поэтому получаем ответ снова и снова.
В этом контексте на первый план выходит использование кэша в нашем сервисе, который облегчает и избавляет от ненужных вызовов, повышая производительность в очень значительной степени. Например, нам нужен список провинций страны. Мы знаем, что этот список не изменится, но мы не хотим обращаться к нашей базе данных и запрашивать их каждый раз, когда звоним в нашу службу.
Поэтому использование кэша — это механизм повышения производительности нашего сервиса с использованием временной памяти, которую наш развернутый сервис имеет внутри.
Кэш в 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 позволяет нам создать кэш в нашем приложении, который действительно работает очень хорошо и с которым мы можем получить большую производительность, хотя мы должны знать, как его использовать и не злоупотреблять им ;).
Код проекта можно найти здесь
Увидимся в следующий раз!