-
Notifications
You must be signed in to change notification settings - Fork 3
Issue‐redis
응답시간을 개선시키기 위해 Redis
를 사용하여 캐시 서버를 도입하여 보았습니다.
Cache는 자주 사용하는 데이터나 값을 미리 저장해놓는 임시 데이터 저장소를 의미합니다.
그러므로 Cache를 보관하는 장소는 원래의 데이터의 저장소보다 더 빠르고 효율적으로 엑세스 할 수 있어야 할 필요가 있습니다.
동일한 데이터에 대해 반복적으로 엑세스하는 상황이 많을 때 cache를 사용하는 것이 좋습니다.
Reids란 In-Memory 데이터 저장소 입니다.
단순한 key-value 구조를 가지고 있기 때문에 어떤 데이터라도 쉽게 저장 할 수 있다는 특징을 가지고 있습니다.
모든 데이터를 Memory에 올려두는 In-Memory 저장소이기 때문에 굉장히 빠릅니다. 평균 작업 속도가 1ms 이하 인 빠른 처리속도를 가지고 있기 때문에, 초당 수백 건의 작업이 가능합니다.
따라서 레디스를 캐시서버로 사용하였을 때 지연시간은 줄이고, 처리량을 늘릴 수 있습니다.
DB로 사용하는 mysql에 redis를 캐시 서버로 사용하도록 구성하였습니다.
데이터를 조회시 DB에서 검색하기 전에 Redis에서 검색 정보를 먼저 찾습니다.
만약 정보가 캐시 서버에 있다면 (Cache hit), 캐시 서버에서 응답을 받아옵니다.
만약 정보가 캐시 서버에 없다면 (Cache Miss), DB에서 정보를 찾습니다.
캐시 서버는 DB보다 속도가 빠르기 때문에 만약 정보가 캐시 서버에 있다면 DB를 검색할 필요가 없기 때문에 응답속도도 빨라집니다.
Spring Boot + Redis를 통하여 캐싱을 구현하여 보았습니다.
Reids Dependency 추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
Redis에 접근하기 위한 커넥션 추가
Redis 내부에 있는 데이터와의 엑세스를 도와주는 RedisTemplate에 설정을 추가해준다.
@Configuration
@EnableCaching
@EnableRedisRepositories
@RequiredArgsConstructor
public class RedisConfig {
@Value("${spring.redis.host}")
private String host //호스트
@Value("${spring.redis.port}")
private int port; //포트
private final ObjectMapper objectMapper;
@Bean
public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer(objectMapper));
return redisTemplate;
}
}
Controller에 @Cacheable 설정
@Cacheable 어노테이션을 추가하여 메소드의 호출 결과를 redis에 저장하도록 설정해줍니다.
/ * 상품 상세 조회*/
@Cacheable(value = "getProduct", key = "#id")
@GetMapping("/{productId}")
public BaseResponse<GetProductResDto> getProduct(@PathVariable("productId") Long id) {
....
}
상품 상세 조회 API를 호출하여 테스트하여보겠습니다.
첫번째 호출
상세 조회 API를 처음 호출 하였을 때는 콘솔 로그에 DB 쿼리가 찍혔고, 응답에 291ms가 걸렸습니다.
두번째 호출
다시 한번 상세 조회 API를 호출하였더니 이번엔 응답에 10ms 걸렸습니다.
응답시간이 확연히 감소한 것을 알 수 있었습니다.
redis-cli에 접속하여 key를 조회해보면, 정상적으로 캐싱이 이루어졌음을 확인 할 수 있었습니다.
참고 :
[NHN FORWARD 2021] Redis 야무지게 사용하기
https://www.youtube.com/watch?v=92NizoBL4uA
캐싱 개요 / 전략
https://aws.amazon.com/ko/caching/
https://docs.aws.amazon.com/ko_kr/AmazonElastiCache/latest/red-ug/Strategies.html