2. Caffeine
Caffeine – это высокопроизводительная библиотека кеширования в памяти, которая отличается от Ehcache максимальной скоростью работы и расширенными возможностями.
Нюансы работы с Caffeine
Стратегии удаления:
Кеш автоматически удаляет устаревшие или редко используемые записи.
Поддерживаются три механизма:
Удаление на основе времени (TTL).
Удаление на основе неактивности (time-to-idle).
Удаление при достижении максимального размера.
Мониторинг:
Caffeine поддерживает метрики, что позволяет отслеживать использование кеша, количество попаданий и промахов.
Ленивая загрузка данных:
Caffeine позволяет автоматически загружать данные при промахе кеша.
Ограничения:
Как и Ehcache, Caffeine работает только локально.
Подходит для небольших и средних объёмов данных.
Шаги настройки Caffeine-кеша
Конфигурация Caffeine-кеша:
#Java #Training #Spring #Caffeine
Caffeine – это высокопроизводительная библиотека кеширования в памяти, которая отличается от Ehcache максимальной скоростью работы и расширенными возможностями.
Нюансы работы с Caffeine
Стратегии удаления:
Кеш автоматически удаляет устаревшие или редко используемые записи.
Поддерживаются три механизма:
Удаление на основе времени (TTL).
Удаление на основе неактивности (time-to-idle).
Удаление при достижении максимального размера.
Caffeine.newBuilder()
.maximumSize(500) // Максимум 500 записей
.expireAfterWrite(10, TimeUnit.MINUTES) // Удаление через 10 минут
.expireAfterAccess(5, TimeUnit.MINUTES) // Удаление через 5 минут неактивности
.build();
Мониторинг:
Caffeine поддерживает метрики, что позволяет отслеживать использование кеша, количество попаданий и промахов.
@Bean
public CaffeineCacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("usersCache");
cacheManager.setCaffeine(Caffeine.newBuilder()
.recordStats() // Включаем статистику
.maximumSize(1000));
return cacheManager;
}
Ленивая загрузка данных:
Caffeine позволяет автоматически загружать данные при промахе кеша.
LoadingCache<Long, User> userCache = Caffeine.newBuilder()
.maximumSize(100)
.build(id -> loadUserById(id)); // Метод для загрузки данных
Ограничения:
Как и Ehcache, Caffeine работает только локально.
Подходит для небольших и средних объёмов данных.
Шаги настройки Caffeine-кеша
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
Конфигурация Caffeine-кеша:
@Configuration
@EnableCaching
public class CaffeineCacheConfig {
@Bean
public CaffeineCacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("usersCache");
cacheManager.setCaffeine(Caffeine.newBuilder()
.initialCapacity(100)
.maximumSize(500)
.expireAfterWrite(10, TimeUnit.MINUTES)
.recordStats());
return cacheManager;
}
}
Теперь кеширование данных с Caffeine готово.
#Java #Training #Spring #Caffeine
Примеры использования кеша на примере Caffeine и Redis
1. Пример с использованием Caffeine
Допустим, у нас есть метод, который возвращает данные пользователя.
Проверка:
Первый вызов getUserById(1L) загрузит данные из базы.
Повторный вызов вернёт данные из кеша.
Метод updateUser(1L, user) очистит устаревшие данные из кеша.
Вывод: Кеш на базе Caffeine идеально подходит для небольших объёмов данных с высокой скоростью работы.
2. Пример с использованием Redis
Допустим, мы создаём приложение, где кеш хранится в Redis.
Проверка:
При вызове getProductById(1L) данные сохраняются в Redis.
Повторный вызов с тем же ID возвращает данные из Redis без обращения к базе.
Метод updateProduct(1L, product) удаляет кешированные данные.
Преимущества Redis:
Данные доступны для всех экземпляров приложения в распределённой системе.
Redis поддерживает TTL (время жизни кеша), что удобно для управления устареванием данных.
#Java #Training #Spring #Caffeine #Redis
1. Пример с использованием Caffeine
Допустим, у нас есть метод, который возвращает данные пользователя.
@Service
public class UserService {
@Cacheable("usersCache")
public User getUserById(Long id) {
System.out.println("Fetching user from database...");
// Имитация запроса к базе данных
return new User(id, "User" + id);
}
@CacheEvict(value = "usersCache", key = "#id")
public void updateUser(Long id, User user) {
System.out.println("Updating user in database...");
// Обновление в базе
}
}
Проверка:
Первый вызов getUserById(1L) загрузит данные из базы.
Повторный вызов вернёт данные из кеша.
Метод updateUser(1L, user) очистит устаревшие данные из кеша.
Вывод: Кеш на базе Caffeine идеально подходит для небольших объёмов данных с высокой скоростью работы.
2. Пример с использованием Redis
Допустим, мы создаём приложение, где кеш хранится в Redis.
@Service
public class ProductService {
@Cacheable("productCache")
public Product getProductById(Long id) {
System.out.println("Fetching product from database...");
// Имитация запроса к базе данных
return new Product(id, "Product" + id);
}
@CacheEvict(value = "productCache", key = "#id")
public void updateProduct(Long id, Product product) {
System.out.println("Updating product in database...");
// Обновление в базе
}
}
Проверка:
При вызове getProductById(1L) данные сохраняются в Redis.
Повторный вызов с тем же ID возвращает данные из Redis без обращения к базе.
Метод updateProduct(1L, product) удаляет кешированные данные.
Преимущества Redis:
Данные доступны для всех экземпляров приложения в распределённой системе.
Redis поддерживает TTL (время жизни кеша), что удобно для управления устареванием данных.
#Java #Training #Spring #Caffeine #Redis