티스토리 뷰

Redis

Redis 캐시 사용해보기

장진혁 2023. 4. 9. 16:59
지난 번에 Jmeter를 이용해서 순간적으로 많은 트래픽을 보냈다.
그 결과 데이터베이스 조회건수가 늘어나고 자원도 많이 소모된다.
그런데 같은 정보를 계속 조회한다면?
굉장히 비효율적일 것이라고 생각이된다.

현재 MySQL 데이터 베이스를 쓰고 있는데
외부저장장치에 저장되어 있는 데이터를 읽어서 연산을 하는데
HDD, SSD에 접근해서 읽어오는 것보다
RAM에 접근해서 캐시되어있는 데이터를 읽어오는 것이
병목현상이나 속도면에서도 장점이 있을것으로 예상이 된다.

Cache 란?
  • 데이터나 값을 미리 복사하여 저장해두는 임시 저장소입니다.
  • 캐시를 사용하면 자주 사용되는 데이터나 값을 더 빠르게 액세스할 수 있습니다.
  • 일반적으로 캐시는 빠른 액세스 속도를 제공하기 위해 메모리에 저장됩니다.
  • 매번 데이터를 계산하거나 디스크에서 읽어와야 하는 작업을 수행할 때, 이 작업을 캐시에 저장하면 다음에 같은 작업을 수행할 때 더 빠르게 액세스할 수 있습니다.
  • 캐시를 사용하면 시스템의 부하를 감소시킬 수 있습니다.
  • 캐시된 데이터는 메모리에 저장되기 때문에, 디스크나 네트워크 등에 액세스할 필요가 없어 시스템 부하를 줄일 수 있습니다.
Redis 란? (Remote Dictionary Server)
  • Redis는 오픈 소스 기반의 인메모리 데이터 저장소이며, 다양한 데이터 구조를 지원하는 NoSQL 데이터베이스입니다. Redis는 key-value 형태로 데이터를 저장하며, 기본적으로 메모리에 데이터를 저장하고 디스크에도 데이터를 저장할 수 있다.
  • Redis는 데이터를 메모리에 저장하기 때문에 매우 빠른 데이터 액세스 속도를 제공한다. 디스크에서 데이터를 읽어오는 것보다 수백 배 이상 빠르다.
위에 설명과 같이 대용량 트래픽에 대응하려면 캐시데이터를 이용하는것이
프로젝트 성능 향상에 도움이 된다고 생각된다.

이제 로컬환경에서 설치를 해보고 사용해보자
나는 도커를 사용해서 쉽게 설치해서 사용할 것이다.

 

도커 설치

https://www.docker.com/products/docker-desktop/

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

터미널에서 Redis 이미지 다운로드하고 실행
# docker pull redis

# docker run --name myredis -d -p 6379:6379 redis

# docker run -it --link myredis:redis --rm redis redis-cli -h redis -p 6379
도커에서 Redis-cli 환경으로 진입하기
- 도커에 모든 컨테이너가 종료되어 있을경우 시작을해야한다.

시작할 컨테이너가 있는지 확인
# docker ps -al

컨테이너 실행
# docker start myredis

Redis cli접속
# dicker exec -it myredis redis-cli

redis 컨데이너가 실행되고 있다.
키와 값들이 잘들어가고 읽고 잘된다.

밑에 있는 블로그를 참고해서 테스트를 해보겠습니다.

https://kim-oriental.tistory.com/28

 

[JAVA Spring Boot] Rest API + 레디스 캐시 (Redis Cache) 적용 및 샘플 예제

안녕하세요, 이번엔 Spring Boot Rest API 서비스를 만들고, Redis를 이용하여 API 캐시(cache)를 적용해보는 샘플을 만들어 보도록 하겠습니다. API 캐시란 우선 캐시(Cache)란, 한번 처리한 데이터를 임시로

kim-oriental.tistory.com

RedisConfig
@EnableCaching
@Configuration
public class RedisConfig {

  @Value("${spring.redis.host}")
  private String host;

  @Value("${spring.redis.port}")
  private int port;

  @Bean
  public RedisConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory(host, port);
  }

  @SuppressWarnings("deprecation")
  @Bean
  public CacheManager cacheManager() {
    RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory());
    RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer 변경
        .prefixKeysWith("Test:") // Key Prefix로 "Test:"를 앞에 붙여 저장
        .entryTtl(Duration.ofMinutes(30)); // 캐시 수명 30분
    builder.cacheDefaults(configuration);
    return builder.build();
  }

}
Controller
@RestController
public class TestController {

  @Autowired
  TestService svc;

  @Cacheable(value = "TestVo", key = "#id")
  @GetMapping("/getTest")
  public TestVo getData(@RequestParam String id ){

    return svc.getTestSvc(id);
  }
Service
@Service
public class TestService {
  
  public TestVo getTestSvc(String id){
    TestVo tvo = new TestVo();
    tvo.setId(id);
    tvo.setText( id + "님, 안녕하세요~!");

    System.out.println("[id:" + id + "] Service 에서 연산을 수행합니다");

    return tvo;
  }
}
Vo
@Data // Lombok 미적용 시, Getter/Setter 메서드 추가
public class TestVo {

  private String id;
  private String text;

}
application.properties
spring.redis.host=127.0.0.1
spring.redis.port=6379
테스트

한 번 입력하면 캐시로 들어가고 계속 조회하면 캐시를 조회해서 값을 가지고온다.

다음은 실제 프로젝트에 적용해보도록 하겠습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함