Redis를 캐시 서버로 사용하기

Redis를 캐시 서버로 사용하기

생성일
Oct 19, 2024 11:36 AM
최종 편집 일시
Last updated October 24, 2024
태그
JAVA
DB

레디스 설치

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로 캐시를 사용하는 것과 인메모리 캐시 사용의 차이점

  1. 인메모리 캐시
    1. 서버 메모리 내에서만 데이터를 유지한다.
    2. 여러 애플리케이션 인스턴스가 있는 경우, 각각의 인스턴스는 서로 다른 캐시 데이터를 갖고 있기 때문에 분산 캐시를 지원하지 안흔ㄴ다.
    3. 애플리케이션 재시작 시 캐시 데이터는 증발한다.
  1. Redis 캐시
    1. 외부 캐시 서버이기 때문에 분산 시스템에서 여러 애플리케이션 인스턴스가 동일한 캐시 데이터를 공유할 수 있다.
    2. 메모리에 데이터를 저장하지만 디스크 백업 설정을 통해 재시작 시에도 캐시 데이터를 유지할 수 있다.
    3. 확장성과 성능이 뛰어나고 데이터가 일정 시간 지나면 자동으로 삭제되는 TTL(Time To Live) 설정이 가능하다.

Redis 캐시 서버 사용 시 주의사항

  1. 캐시 사이즈
    1. Redis는 메모리 기반 데이터 저장소이므로 캐시할 데이터의 양을 적절히 설정해줘야 한다.
    2. 과도한 데이터가 메모리를 초과하면 성능 저하가 발생할 수 있으며, 이를 방지하기 위해 Redis는 LRU(Least Recently Used) 등의 캐시 삭제 정책을 제공한다.
  1. TTL 설정
    1. 캐시 항목마다 TTL을 설정하여 캐시 데이터가 너무 오래 유지되지 않도록 할 수 있다.
  1. 서버 장애 대비
    1. Redis는 HA 구성을 지원하여 장애 시 자동으로 failover할 수 있도록 Redis Sentinel 또는 Redis Cluster를 구성할 수 있다.