Spring Boot의 하이브리드 캐시 전략 : Redisson 및 Caffeine 통합 가이드
효율적인 캐싱 전략: Spring Boot 애플리케이션의 하이브리드 캐싱
최신 애플리케이션 개발에서는 성능과 확장성이 시스템의 성패를 결정하는 핵심 요소입니다. 캐싱은 데이터베이스 로드를 줄이고 대기 시간을 줄이며 원활한 사용자 경험을 보장함으로써 이를 개선하는 데 중요한 역할을 합니다. 그러나 모든 시나리오에 완벽한 단일 캐싱 솔루션은 없습니다.
로컬 캐시(예: Caffeine)는 메모리에서 실행되고 애플리케이션에 가깝기 때문에 엄청나게 빠른 속도를 제공합니다. 자주 액세스하는 데이터에 대한 응답 시간을 줄이는 데 유용합니다. 반면에 분산 캐시(예: Redisson의 Redisson)는 애플리케이션의 여러 인스턴스에 걸쳐 확장성과 일관성을 제공합니다. 분산 캐싱은 분산 시스템의 모든 노드가 동일한 최신 데이터에 액세스할 수 있도록 보장하며 이는 다중 노드 환경에서 매우 중요합니다. 그러나 로컬 또는 분산 캐싱에만 의존하면 다음과 같은 문제가 발생할 수 있습니다.
- 로컬 캐시
- 는 노드 간에 데이터 업데이트가 동기화되지 않기 때문에 분산 환경에서 일관성이 떨어질 수 있습니다. 분산 캐시
- 는 약간의 네트워크 지연 시간을 발생시키며 이는 매우 낮은 지연 시간 시나리오에 적합하지 않을 수 있습니다. 여기서
이 효과적인 솔루션이 됩니다. Caffeine과 Redisson을 사용하여 로컬 캐싱과 분산 캐싱의 장점을 결합함으로써 분산 캐싱 섹스로 일관성과 확장성을 유지하면서 로컬 캐싱 속도의 높은 성능을 얻을 수 있습니다. 이 기사에서는 최적의 성능과 데이터 일관성을 보장하기 위해 Spring Boot 애플리케이션에서 하이브리드 캐싱을 구현하는 방법을 살펴봅니다.
구현 단계
1단계: 종속성 추가
먼저
파일에 필요한 종속성을 추가합니다.
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.43.0</version> </dependency>
캐시 구성은 다음과 같습니다.
주요 구성품에 대한 자세한 설명
@Configuration @EnableCaching public class CacheConfig implements CachingConfigurer { @Value("${cache.server.address}") private String cacheAddress; @Value("${cache.server.password}") private String cachePassword; @Value("${cache.server.expirationTime:60}") private Long cacheExpirationTime; @Bean(destroyMethod = "shutdown") RedissonClient redisson() { Config config = new Config(); config.useSingleServer().setAddress(cacheAddress).setPassword(cachePassword.trim()); config.setLazyInitialization(true); return Redisson.create(config); } @Bean @Override public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(cacheExpirationTime, TimeUnit.MINUTES)); return cacheManager; } @Bean public CacheEntryRemovedListener cacheEntryRemovedListener() { return new CacheEntryRemovedListener(cacheManager()); } @Bean @Override public CacheResolver cacheResolver() { return new LocalCacheResolver(cacheManager(), redisson(), cacheEntryRemovedListener()); } }
1. 캐시 관리자(CacheManager)
은 캐시 수명 주기를 관리하고 적절한 캐시 구현(예: 로컬 또는 분산)에 대한 액세스를 제공하는 일을 담당합니다. 이 예에서는을 사용하여 메모리 내 캐싱을 활성화하고 CacheManager
을 통해 만료 정책을 구성합니다. CaffeineCacheManager
Caffeine
2. 캐시 리졸버
는 로컬(Caffeine) 캐시와 분산(Redisson) 캐시를 연결하여 하이브리드 전략이 효과적으로 적용되도록 합니다. CacheResolver
LocalCacheResolver
@Component public class LocalCacheResolver implements CacheResolver { // ... (代码与原文相同) ... }
public class LocalCache implements Cache { // ... (代码与原文相同) ... }
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.43.0</version> </dependency>
메소드가 호출됩니다. 이것은 로컬 캐시 및 분산 캐시 (redis)에 데이터를 저장합니다.
데이터를 검색하기 위해 시스템은 먼저 로컬 캐시에 키가 존재하는지 확인합니다. 키를 찾을 수 없으면 분산 캐시를 쿼리하십시오. 이 값이 분산 캐시에 존재하는 경우 로컬 캐시에 추가하여 팔로우 방문을 더 빠르게 방문하십시오.
로 배출됩니다
@Cacheable
에 의해 알림을받습니다.
put
@Configuration @EnableCaching public class CacheConfig implements CachingConfigurer { @Value("${cache.server.address}") private String cacheAddress; @Value("${cache.server.password}") private String cachePassword; @Value("${cache.server.expirationTime:60}") private Long cacheExpirationTime; @Bean(destroyMethod = "shutdown") RedissonClient redisson() { Config config = new Config(); config.useSingleServer().setAddress(cacheAddress).setPassword(cachePassword.trim()); config.setLazyInitialization(true); return Redisson.create(config); } @Bean @Override public CacheManager cacheManager() { CaffeineCacheManager cacheManager = new CaffeineCacheManager(); cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(cacheExpirationTime, TimeUnit.MINUTES)); return cacheManager; } @Bean public CacheEntryRemovedListener cacheEntryRemovedListener() { return new CacheEntryRemovedListener(cacheManager()); } @Bean @Override public CacheResolver cacheResolver() { return new LocalCacheResolver(cacheManager(), redisson(), cacheEntryRemovedListener()); } }
및
redisson <🎜를 통합하면 상당한 성능 향상을 달성하고 응용 프로그램 노드 간의 데이터 일관성을 보장 할 수 있습니다.
<<> 및 <<> 및@Component public class LocalCacheResolver implements CacheResolver { // ... (代码与原文相同) ... }
위 내용은 Spring Boot의 하이브리드 캐시 전략 : Redisson 및 Caffeine 통합 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

일부 애플리케이션이 제대로 작동하지 않는 회사의 보안 소프트웨어에 대한 문제 해결 및 솔루션. 많은 회사들이 내부 네트워크 보안을 보장하기 위해 보안 소프트웨어를 배포 할 것입니다. ...

많은 응용 프로그램 시나리오에서 정렬을 구현하기 위해 이름으로 이름을 변환하는 솔루션, 사용자는 그룹으로, 특히 하나로 분류해야 할 수도 있습니다.

시스템 도킹의 필드 매핑 처리 시스템 도킹을 수행 할 때 어려운 문제가 발생합니다. 시스템의 인터페이스 필드를 효과적으로 매핑하는 방법 ...

IntellijideAultimate 버전을 사용하여 봄을 시작하십시오 ...

데이터베이스 작업에 MyBatis-Plus 또는 기타 ORM 프레임 워크를 사용하는 경우 엔티티 클래스의 속성 이름을 기반으로 쿼리 조건을 구성해야합니다. 매번 수동으로 ...

Java 객체 및 배열의 변환 : 캐스트 유형 변환의 위험과 올바른 방법에 대한 심층적 인 논의 많은 Java 초보자가 객체를 배열로 변환 할 것입니다 ...

전자 상거래 플랫폼에서 SKU 및 SPU 테이블의 디자인에 대한 자세한 설명이 기사는 전자 상거래 플랫폼에서 SKU 및 SPU의 데이터베이스 설계 문제, 특히 사용자 정의 판매를 처리하는 방법에 대해 논의 할 것입니다 ...

Redis 캐싱 솔루션은 제품 순위 목록의 요구 사항을 어떻게 인식합니까? 개발 과정에서 우리는 종종 a ... 표시와 같은 순위의 요구 사항을 처리해야합니다.
