Spring Boot(11)-Spring Cache 사용
Spring Cache 사용 하기
Spring 은 Cache 추상 을 제공 합 니 다.이것 은 우리 가 어떤 bean 의 외부 호출 에 Cache 를 사용 해 야 하 는 지 설명 할 수 있 도록 합 니 다.방법 호출 은 Cache 를 사용 한 후 실제 방법 을 호출 하기 전에 캐 시 에서 결 과 를 가 져 옵 니 다.캐 시 에 없 으 면 실제 방법 을 호출 합 니 다.이것 도 AOP 를 기반 으로 이 루어 집 니 다.Spring Cache 에 관 한 소 개 는 본 고의 중점 이 아니 므 로 필요 하 다 면 필자 가 쓴 것 을 참고 할 수 있다.http://elim.iteye.com/blog/2123030。
Spring Boot 애플 리 케 이 션 에서 Spring Cache 를 사용 하려 면
@SpringBootConfiguration
표 시 된 Class 에@EnableCaching
를 추가 해 야 합 니 다.Spring Boot 는 Classpath 에서 제공 하 는 Spring Cache 구현 클래스 에 따라 적합 한 실현 자 를 선택 하여 자동 으로 설정 합 니 다.지원 하 는 실현 은 Ehcache 기반 실현,Redis 기반 실현 등 이 있 으 며 자세 한 내용 은org.springframework.boot.autoconfigure.cache.CacheConfiguration
의 소스 코드 를 참고 할 수 있 습 니 다.찾 지 못 하면 ConcurrentMap 기반 구현 을 사용 합 니 다.다음 코드 에서 Spring Cache 를 사용 합 니 다.
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(Application.class);
app.setAddCommandLineProperties(false);
app.run(args);
}
}
그리고 bean 에서 Spring Cache 가 제공 하 는 주 해 를 사용 하여 캐 시 를 정의 할 수 있 습 니 다.아래 코드 에 서 는
getTime()
이름 을cacheName1
캐 시 로 정의 합 니 다.@Component
public class SimpleService {
@Cacheable("cacheName1")
public long getTime() {
return System.currentTimeMillis();
}
}
캐 시 를 간단하게 검증 하 는 단원 테스트 는 다음 과 같 습 니 다.
@SpringBootTest(classes=Application.class)
@RunWith(SpringJUnit4ClassRunner.class)
public class CacheTest {
@Autowired
private SimpleService simpleService;
@Test
public void testGetTime() throws Exception {
long time1 = this.simpleService.getTime();
TimeUnit.MILLISECONDS.sleep(100);
long time2 = this.simpleService.getTime();
Assert.assertEquals(time1, time2);
}
}
Ehcache 로 구현
Spring Cache 의 Ehcache 를 사용 해 야 합 니 다.먼저 pom.xml 에 다음 과 같은 의존 도 를 추가 해 야 합 니 다.
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-cacheartifactId>
dependency>
<dependency>
<groupId>net.sf.ehcachegroupId>
<artifactId>ehcacheartifactId>
dependency>
그리고 가장 쉬 운 방법 은 Classpath 의 루트 아래 에
ehcache.xml
파일 을 놓 는 것 입 니 다.그러면 Spring Boot 는 기본적으로 Spring Cache 의 Ehcache 를 사용 합 니 다.Ehcache 의 자동 설정 은EhCacheCacheConfiguration
에서 정의 합 니 다.Ehcache 의 프로필 이 Classpath 루트 에 저장 되 어 있 지 않 으 면spring.cache.ehcache.config
을 통 해 지정 할 수 있 습 니 다.예 를 들 어 아래 코드 는 Classpath 의 config 디 렉 터 리 에서 ehcache.xml 파일 을 Ehcache 의 설정 파일 로 지정 합 니 다.spring.cache.ehcache.config=classpath:/config/ehcache.xml
Spring Cache 의 자동 설정 속성 정의 클래스 는 Cache Properties 입 니 다.API 문서 나 소스 코드 를 참고 하면 선택 한 Spring Cache 의 실현 이 지정 할 수 있 는 상세 한 설정 정 보 를 볼 수 있 습 니 다.
Simple Service
getTime()
가 지정 한 Cache 는 cacheName 1 이라는 Cache 입 니 다.그래서 ehcache.xml 에서 cacheName 1 이라는 Cache 를 정의 해 야 합 니 다.설정 은 다음 과 같 습 니 다.<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
maxBytesLocalHeap="100M">
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120"
maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap" />
defaultCache>
<cache name="cacheName1" />
ehcache>
응용 프로그램 에 다양한 이름 의 Cache 가 많이 적용 되 었 다 면 ehcache.xml 에서 한 번 정의 하면 너무 귀 찮 을 수 있 습 니 다.아마도 주요 Cache 를 ehcache.xml 에 정의 하여 충분 한 사용자 정의 설정 을 하고 싶 을 것 입 니 다.그 다음 에 다른 것 은 사용 할 때 자동 으로 만 들 수 있 고 기본 캐 시 설정 을 사용 하면 자신의 EhCacheCacheManager 가 bean 을 실현 하고
getMissingCache()
의 논 리 를 존재 하지 않 으 면 만 들 수 있 습 니 다.이렇게 하면 Spring Boot 는 EhCacheCacheManager bean 을 자동 으로 만 들 지 않 습 니 다.아래 의 코드 는 간단 한 예시 이다.@Component
public class MyEhCacheCacheManager extends EhCacheCacheManager {
@Override
protected Cache getMissingCache(String name) {
Cache cache = super.getMissingCache(name);
if (cache == null) {
Ehcache ehcache = super.getCacheManager().addCacheIfAbsent(name);
cache = new EhCacheCache(ehcache);
}
return cache;
}
}
Redis 사용 실현
Redis 를 사용 하려 면 pom.xml 에
spring-boot-starter-data-redis
의존 도 를 추가 해 야 합 니 다.그러면 Spring Boot 는 RedisTemplate bean 을 자동 으로 만 듭 니 다.RedisTemplate bean 이 있 으 면 Spring Boot 는 Redis 를 기반 으로 하 는 Spring Cache Manager,RedisCache Manager 를 자동 으로 만 듭 니 다.<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
Spring Boot 가 기본적으로 만 든 RedisTemplate 는 localhost 를 서비스 주소 로 사용 합 니 다.포트 번 호 는 6379 이 고 데이터베이스 색인 은 0 이 며
spring.redis.host
을 통 해 Redis 서비스 IP 를 지정 할 수 있 습 니 다.spring.redis.port
Redis 서비스 감청 포트 번 호 를 지정 하고spring.redis.database
사용 할 데이터 라 이브 러 리 색인 번 호 를 지정 할 수 있 습 니 다.다음 코드 에 서 는10.10.10.3
이 호스트 의 Redis 를 사용 하고 데이터베이스 색인 번 호 는 1 입 니 다.Redis 에 대한 더 많은 설정 정 보 는org.springframework.boot.autoconfigure.data.redis.RedisProperties
의 API 문 서 를 참고 할 수 있 습 니 다.spring.redis.host=10.10.10.3
spring.redis.database=1
기본 Spring Cache 의 Redis 가 Redis 에 저 장 된 Key 는
cacheName::cacheKey
형식 입 니 다.그 중에서 cacheName 은 현재 Spring Cache 의 name 이 고 cacheKey 는 Spring Cache 가 전달 한 Key 입 니 다.spring.cache.redis.key-prefix
을 통 해 Redis 에 저 장 된 Key 의 접 두 사 를 지정 할 수 있 으 며,이 속성 이 지정 되면 생 성 된 Key 는 이 접두사 에 Spring Cache 가 전달 하 는 Key 가 됩 니 다.예 를 들 어 아래 코드 에 접 두 사 는test-spring-cache::
로 지정 되 어 있 으 며,Spring Cache 가 전달 하 는 Key 가 key 1 이면 최종 적 으로 Redis 에 저 장 된 Key 는test-spring-cache::key1
입 니 다.spring.cache.redis.key-prefix=test-spring-cache::
spring.cache.redis.timeToLive
을 통 해 Redis 캐 시 에 있 는 Key 의 생존 시간 을 지정 할 수 있 습 니 다.아래 코드 에 캐 시 유효 시간 이 60 초 로 지정 되 어 있 습 니 다.spring.cache.redis.timeToLive=60s
Spring Cache 의 Redis 구현 에 대한 더 많은 설정 은
org.springframework.boot.autoconfigure.cache.CacheProperties.Redis
API 문 서 를 참고 할 수 있 습 니 다.지정 한 Cache 구현
Classpath 에 여러 개의 Spring Cache 구현 클래스 를 동시에 저장 하고 여러 개의 Spring Cache 구현 클래스 가 사용 조건 을 만족 시 킬 수 있 을 때 Spring Boot 는 일정한 순서에 따라 선택 합 니 다.특정한 유형의 Spring Cache 가 적용 되면 다른 유형의 Spring Cache 가 사용 되 지 않 습 니 다.이 자동 으로 사용 되 는 전 제 는 현재 환경 에 Spring Cache 가 없 는 CacheManager 형식의 bean 을 요구 하기 때 문 입 니 다.자동 으로 사용 되 는 순 서 는
org.springframework.boot.autoconfigure.cache.CacheType
이 매 거 진 에서 정 의 된 순서에 따라 이 루어 집 니 다.그 정 의 는 다음 과 같 습 니 다. /**
* Generic caching using 'Cache' beans from the context.
*/
GENERIC,
/**
* JCache (JSR-107) backed caching.
*/
JCACHE,
/**
* EhCache backed caching.
*/
EHCACHE,
/**
* Hazelcast backed caching.
*/
HAZELCAST,
/**
* Infinispan backed caching.
*/
INFINISPAN,
/**
* Couchbase backed caching.
*/
COUCHBASE,
/**
* Redis backed caching.
*/
REDIS,
/**
* Caffeine backed caching.
*/
CAFFEINE,
/**
* Simple in-memory caching.
*/
SIMPLE,
/**
* No caching.
*/
NONE
따라서 Classpath 에서 Ehcache 와 Redis 를 동시에 가 진 Spring Cache 가 실현 되면 Ehcache 의 실현 을 우선 사용 하고 Redis 의 실현 을 사용 하려 면
spring.cache.type=redis
지정 을 통 해 Redis 의 실현 을 사용 할 수 있 습 니 다.Cache 를 지정 하여 자동 설정 에 만 적용 합 니 다.Cache Manager 를 정의 한 경우 이 설정 은 잘못 되 었 습 니 다.
CacheManagerCustomizer
Cache Manager Customizer 는 Cache Manager 를 사용자 정의 로 확장 하 는 데 사 용 됩 니 다.그 정 의 는 다음 과 같 습 니 다.
@FunctionalInterface
public interface CacheManagerCustomizerextends CacheManager> {
/**
* Customize the cache manager.
* @param cacheManager the {@code CacheManager} to customize
*/
void customize(T cacheManager);
}
어떤 CacheManager 에 대한 사용자 정의 가 필요 할 때 CacheManager Customizer 인 터 페 이 스 를 실현 할 수 있 습 니 다.사용자 정의 가 필요 한 CacheManager 구현 클래스 로 범 형 을 지정 한 다음 Spring bean 으로 정의 할 수 있 습 니 다.다음 코드 는 Ehcache 가 구현 한 CacheManager 에 대해 사용자 정의 하 였 으 며,EhCacheCacheManager 가 초기 화 된 후 기본 Cache 설정 으로 Cache 를 만 들 었 습 니 다.
@Component
public class EhcacheCacheManagerCustomizer implements CacheManagerCustomizer<EhCacheCacheManager> {
@Override
public void customize(EhCacheCacheManager cacheManager) {
List<String> cacheNames = Arrays.asList("cacheName1", "cacheName2", "cacheName3", "cacheName4", "cacheName5", "cacheName6");
cacheNames.forEach(cacheManager.getCacheManager()::addCacheIfAbsent);
}
}
Spring Cache 에 대한 자동 설정 은
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
의 소스 코드 나 API 문 서 를 참고 할 수 있 습 니 다.(비고:본 고 는 Spring Boot 2.0.3 을 바탕 으로 쓴 것 입 니 다)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[MeU] Hashtag 기능 개발➡️ 기존 Tag 테이블에 존재하지 않는 해시태그라면 Tag , tagPostMapping 테이블에 모두 추가 ➡️ 기존에 존재하는 해시태그라면, tagPostMapping 테이블에만 추가 이후에 개발할 태그 기반 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.