Spring 환경에서 Redis 사용하기

Kim Dong Hyun·2023년 3월 28일
1

Back-End

목록 보기
3/5

Redis란?

Redis는 오픈 소스, 인 메모리 데이터 구조 스토어이며, 다양한 데이터 구조를 지원한다.

주요 용도로는 캐싱, 메시징, 세션 관리 등이 있다. Redis는 기본적으로 디스크가 아닌 메모리에 데이터를 저장하므로 매우 빠른 속도로 데이터를 처리할 수 있다. 또한 Redis는 영속성을 지원하여 디스크에 데이터를 저장할 수도 있다. Redis는 다양한 프로그래밍 언어로 작성된 클라이언트 라이브러리를 지원하며, 클러스터링 및 마스터-슬레이브 복제와 같은 고급 기능도 제공한다. Redis는 많은 어플리케이션에서 사용되고 있으며, 속도와 성능이 중요한 시스템에서 특히 유용하다.

Redis의 장단점

장점

  • 빠른 데이터 액세스
    Redis는 메모리에 데이터를 저장하기 때문에, 디스크에서 데이터를 읽어오는데 필요한 시간을 줄여 데이터 액세스 속도가 매우 빠르다.

  • 다양한 데이터 구조
    List, Set, Sorted Set, Hash 등의 데이터 구조를 제공한다.

  • Pub/Sub 메커니즘
    Redis는 Pub/Sub 메커니즘을 지원한다. 이를 사용하여 메시지 큐, 실시간 채팅, 이벤트 처리 등 다양한 용도로 사용할 수 있다.

  • 데이터의 영속성 보장
    Redis는 데이터를 디스크에 저장할 수 있는 기능을 제공한다. 이를 통해 Redis가 비정상적으로 종료되거나 장애가 발생해도 데이터를 안전하게 보존할 수 있다.

단점

  • 메모리 제약
    Redis는 메모리에 데이터를 저장하기 때문에, 메모리의 용량에 따라 저장할 수 있는 데이터의 양이 제한된다.

  • 데이터의 일관성 유지
    Redis는 메모리에 데이터를 저장하다가 Redis 서버가 장애가 발생하는 경우 데이터의 일부 또는 전체가 유실될 수 있다. 이를 방지하기 위해 Redis는 데이터를 디스크에 저장하는 기능을 제공하지만 이를 사용하면 데이터 액세스 속도가 느려질 수 있으며, 디스크의 손상 등 다양한 문제가 발생할 수 있다.

  • 스케일 아웃 문제
    Redis는 단일 스레드로 동작하므로, 대규모 데이터 처리를 위해 여러 Redis 인스턴스를 동시에 실행해야 한다. 이는 복잡한 구성과 관리를 필요로 하며, 이로 인한 부하 및 지연 문제도 발생할 수 있다.

Spring에서 Redis 사용하기

1. 의존성 추가

Maven환경

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.6.1</version>
</dependency>

Gradle 환경

dependencies {
    implementation 'redis.clients:jedis:3.6.1'
}

2. Redis 설정

application.properties에 다음을 추가한다.

spring.redis.host=localhost
spring.redis.port=6379

위에는 Redis 서버의 IP주소, 아래는 포트 번호를 입력하면 된다.

3. Redis 사용하기

Redis를 사용하기 위해서는 RedisTemplate 클래스를 사용한다.
여기서 RedisTemplate을 사용하기 위해서 RedisConnectionFactory를 설정해야 한다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyRedisService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

	//데이터 저장하기
    public void saveData(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

	// 데이터 가져오기
    public String getData(String key) {
        return redisTemplate.opsForValue().get(key);
    }
}

0개의 댓글