Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.

@bookjava
🚀 Redis + Spring Cache: Турбо-наддув для бэкенда Самая медленная часть любого приложения это ввод-вывод (I/O). Поход в базу данных (Postgres/MySQL) это "долго" (миллисекунды). Поход в оперативную память это "мгновенно" (наносекунды). Redis - это база данных, которая хранит всё в оперативной памяти (In-Memory). Она идеально подходит на роль кэша. 🧠 Как работает Spring Cache? Spring предоставляет крутую абстракцию. Вам не нужно писать код для подключения к Redis в каждом методе. Вы просто вешаете аннотации, а Spring сам перехватывает вызов метода. Алгоритм @Cacheable: 1. Вызывается метод getUser(1). 2. Spring лезет в кэш (Redis) по ключу user::1. 3. Если данные есть (Cache Hit): Spring НЕ выполняет код метода, а сразу возвращает данные из кэша. 4. Если данных нет (Cache Miss): Spring выполняет метод (идет в БД), берет результат, кладет его в кэш и отдает вам. 🛠 Настройка (2 шага) 1. Зависимости В pom.xml добавляем стартер для кэша и драйвер Redis: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2. Включаем рубильник Над главным классом вешаем @EnableCaching. 💻 Магия аннотаций У нас есть 3 главные аннотации, которые вы обязаны знать: 1. @Cacheable — "Запомни меня" Вешаем над методами поиска (get, find). @Service public class UserService { @Cacheable(value = "users", key = "#id") public User getUserById(Long id) { // Имитация долгого запроса в БД (3 секунды) simulateSlowService(); return userRepository.findById(id).orElseThrow(); } } Результат: Первый вызов займет 3 секунды. Второй, третий и тысячный вызов с тем же ID займут 0.001 секунды. 2. @CacheEvict - "Забудь меня" Самая большая проблема кэширования - инвалидация. Если мы обновили данные юзера в БД, а в кэше осталась старая версия — это баг. При обновлении или удалении мы должны очистить кэш. @CacheEvict(value = "users", key = "#id") public void deleteUser(Long id) { userRepository.deleteById(id); } Теперь при следующем вызове getUserById(id) Spring увидит, что кэш пуст, и снова сходит в БД за свежими данными. 3. @CachePut - "Обнови меня" Используется реже. Метод выполняется всегда, а его результат кладется в кэш, обновляя старое значение. 🆚 Redis vs HashMap "Зачем мне Redis, если я могу создать ConcurrentHashMap прямо в Java?" 1. Память: Если данных много, HashMap съест всю память JVM, и приложение упадет (OutOfMemory). Redis живет отдельно. 2. Микросервисы: Если у вас запущено 3 экземпляра сервиса, у каждого будет свой HashMap. Кэш будет рассинхронизирован. Redis это общий кэш для всех инстансов. 3. Живучесть: При перезагрузке приложения HashMap очищается. Redis (обычно) работает на отдельном сервере и хранит данные даже при рестарте вашего кода. ⚠️ Важный нюанс: Serializable Чтобы положить Java-объект в Redis, его нужно превратить в байты (сериализовать). Ваши DTO и Entity должны реализовывать интерфейс Serializable, либо (что правильнее) нужно настроить Jackson Serializer, чтобы хранить данные в Redis в читаемом JSON-формате. 🔥 Итог: кэширование - это самый простой способ масштабирования. 🔴 Часто читаете, редко меняете? -> @Cacheable. 🔴 Удалили/Обновили? -> @CacheEvict. #Java #Spring #Redis #Caching #Performance 👉 @BookJava
Если у вас установлено приложение,
вы можете сразу перейти в канал