레디스 설치
docker로 레디스를 설치해준다.
docker run --name redis-server -d -p 6379:6379 redis
스프링 부트에서 레디스 캐시서버로 사용하기
gradle로 spring-boot-starter-data-redis를 추가해준다.
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '3.3.4'
application.yml에 redis host와 port 설정을 해준다.
spring: redis: host: localhost port: 6379
캐시로 사용하기 위해 CacheConfig를 @Configuration으로 만들어준다.
import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration @EnableCaching public class CacheConfig { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); return RedisCacheManager.builder(redisConnectionFactory) .cacheDefaults(redisCacheConfiguration) .build(); } }
@EnableCaching을 붙여줘서 캐싱에 레디스를 사용하겠다고 선언한다.
cacheManager로 RedisCacheManager를 사용하겠다고 설정한다.
RedisCacheConfiguration으로 캐시 저장소의 키, 값을 직렬화하는 방법을 지정한다.
특정 메서드에 캐시 적용하기
import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @Service public class MyService { @Cacheable(value = "myCache", key = "#id") public String getDataFromDatabase(Long id) { // 실제 DB나 다른 데이터 소스로부터 데이터를 가져오는 부분 System.out.println("Fetching data from database for id: " + id); return "Data for ID: " + id; } }
@Cacheable이 붙은 메서드는 캐시에 데이터를 저장하고 동일한 키로 호출되면 캐시에서 값을 반환한다.
value는 이 캐시의 이름이다.
key는 캐시에서 사용하는 키를 정의한다.
Redis로 캐시를 사용하는 것과 인메모리 캐시 사용의 차이점
- 인메모리 캐시
- 서버 메모리 내에서만 데이터를 유지한다.
- 여러 애플리케이션 인스턴스가 있는 경우, 각각의 인스턴스는 서로 다른 캐시 데이터를 갖고 있기 때문에 분산 캐시를 지원하지 안흔ㄴ다.
- 애플리케이션 재시작 시 캐시 데이터는 증발한다.
- Redis 캐시
- 외부 캐시 서버이기 때문에 분산 시스템에서 여러 애플리케이션 인스턴스가 동일한 캐시 데이터를 공유할 수 있다.
- 메모리에 데이터를 저장하지만 디스크 백업 설정을 통해 재시작 시에도 캐시 데이터를 유지할 수 있다.
- 확장성과 성능이 뛰어나고 데이터가 일정 시간 지나면 자동으로 삭제되는 TTL(Time To Live) 설정이 가능하다.
Redis 캐시 서버 사용 시 주의사항
- 캐시 사이즈
- Redis는 메모리 기반 데이터 저장소이므로 캐시할 데이터의 양을 적절히 설정해줘야 한다.
- 과도한 데이터가 메모리를 초과하면 성능 저하가 발생할 수 있으며, 이를 방지하기 위해 Redis는 LRU(Least Recently Used) 등의 캐시 삭제 정책을 제공한다.
- TTL 설정
- 캐시 항목마다 TTL을 설정하여 캐시 데이터가 너무 오래 유지되지 않도록 할 수 있다.
- 서버 장애 대비
- Redis는 HA 구성을 지원하여 장애 시 자동으로 failover할 수 있도록 Redis Sentinel 또는 Redis Cluster를 구성할 수 있다.