본문 바로가기

Server Development/Data API

Cache - Redis

 

백엔드에서는 여러 스레드를 통해 이미 생성된 인스턴스들로 다양한 데이터를 CRUD를 한다. 하지만 항상 모든 데이터에 대해서 데이터베이스에서 가져오는 것은 데이터베이스에 큰 부하가되며 이어져 서버에도 많은 부하를 줄 수 있다. 또한 이런 현상은 서버의 전반적인 속도를 늦추는 문제가 생긴다. 이럴 때 사용하는 것이 캐시이다. 

 

Cache

- 자주 사용하는 데이터를 미리 보관해둔 임시 저장소

- 저장 공간이 적고 비용이 좀 비쌈.

- 빠른 I/O 가 가능하다.

 

 

 

캐시를 사용하는 사례

- 자주 호출되지만 프로그램 도중에 잘 변경되지 않는 데이터

 

 

 

Spring boot의 캐시

- JSR(Java Specification Requests) : 자바로 만들어진 플랫폼에 대한 규격을 제안하거나 기술한 것.

- JSR-107 : JCASHE(Java Temporary Caching API)에 대한 내용.

(JSR-107을 따르는 캐시를 Spring에서 사용시 어떤 구현체의 캐시를 사용하더라도 추상화를 그대로 Spring에서 사용가능하다.)

 

 

 

캐시의 종류

 

 

 

  • 로컬 캐시

- 특정 하나의 서버에서만 사용하는 캐시

- 외부서버와 트랜잭션 비용이 들지 않기에 빨리 처리

- 분산 서버 구조(MSA, 로드 밸런싱, Scale Out) 환경에서 캐시를 공유하기 어렵다.

 

 

 

  • 글로벌 캐시

- 여러 서버에서 접근할 수 있는 캐시 서버

- 네트워크를 통해 데이터를 가져오는 트랜잭션 비용이 있기에 로컬 캐시에 비해 느리다.

- 별도의 서버로 운영되기 때문에 서버 간 데이터 공유에 용이하다.

 

 

Redis

- (키-값) 구조의 데이터 저장

- 오픈 소스 기반의 비관계형 데이터 관리 시스템 <-> RDBMS

- 하드 디스크에 저장(기존의 DB의 저장 위치)이 아닌 메모리에 저장하는 방식 -> CPU의 코어와 가까워 속도가 빠르다.

- 확장성이 크다 -> 여러 언어에서 사용 가능.

- Redis Client : Jedis or Lettuce (서버는 Redis Server에 접근하는 방식이므로 하나의 클라이언트로 볼 수있고 Lettuce를 많이 사용)

등 여러가지 특징이 있다.

 

 

 

사용

1. Dependancy 설정

<!-- Redis -->
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

 

2. Properties 설정

- host, port 설정

 

 

3. Config 설정

@Configuration
public class RedisCacheConfig{

	// Properties에서 불러올 값들 @Value사용
    // host
    private String host;

    // 포트
    private int port;

    // 객체 생성 후 repository 사용시
    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        return new LettuceConnectionFactory(host, port);
    }

    // RedisTemplete 사용시
    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }

}

 

4. 저장할 객체 생성-Redis Repositoty연결 or Redis Templete 사용

// Interface
public interface ShortUrlRedisRepository extends CrudRepository<저장할 클래스명, 아이디의 타입> {

}


// Class(VO)
@RedisHash(value = "Prefix 명", timeToLive = 살아있을 시간 설정)

 

 

이 후, 사용하고자 하는 클래스에 주입해 원하는 방식으로 사용하면 된다. 

 

'Server Development > Data API' 카테고리의 다른 글

JPA - Query DSL  (0) 2023.05.11
JPA - Join  (0) 2023.05.09
JPA - @Query with Spring JPA  (0) 2023.04.05
JPA - Query Method with Spring JPA  (0) 2023.04.05
JPA - Auditing  (0) 2023.04.04