Tech/Server

[Spring, Redis] Spring boot에서 redis 서버 여러개 사용하는 방법(하나의 AWS EC2 환경에서 구현하기)

0m1n 2023. 2. 17. 18:00
728x90
반응형

스프링부트에서 여러 개의 Redis 서버를 사용하는 방법이다!

(필자는 여러 개의 Redis 서버를 사용해 jwt토큰 서버, 인기검색어 서버를 분리하는 작업을 하고 있었다.)

 

개발 환경

- aws ec2

- redis

- spring boot

- java 11

1. EC2 설정 (리눅스 서버 설정)

0. 기존 redis.conf 파일

원래 돌아가고 있던 redis.conf 파일의 경로를 찾는다.

1. 기존 redis.conf 파일 복사

기존 redis.conf 파일을 복사 후 이름을 변경한다. (redis2.conf)

2. 복사 파일 설정 변경

복사한 파일의 포트 번호를 변경한다.(6379 -> 6380)

로그 파일 경로도 변경해준다.

3. 복사한 redis 파일 실행

$ redis-server [복사파일 경로]

2. Spring boot 설정

0. 메소드 이름은 무조건 다르게

필자는 작업 중 메소드 이름을 같게 하고 기능을 다르게 해서 구현했었는데 6380 포트로 들어가야하는 데이터가 6379로 들어가는 이슈가 생겼다.

한참을 고민하다 스프링이 같은 Bean으로 인식해 하나로 인식하는 것을 알게 되었다. 이름은 꼭 다르게 하자!

1. Redis Factory 분리

// host : ec2 엔드포인트 , port : redis 포트 번호
@Bean
public RedisConnectionFactory redisConnectionFactoryOne() {
    return new LettuceConnectionFactory(new RedisStandaloneConfiguration("host1", port1));
}

@Bean
public RedisConnectionFactory redisConnectionFactoryTwo() {
    return new LettuceConnectionFactory(new RedisStandaloneConfiguration("host2", port2));
}

2. Redis Template 분리

@Bean
public RedisTemplate<String, String> redisTemplateOne() {
    RedisTemplate<String, String> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactoryOne());
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new StringRedisSerializer());
    return template;
}

@Bean
public RedisTemplate<String, String> redisTemplateTwo() {
    RedisTemplate<String, String> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactoryTwo());
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new StringRedisSerializer());
    return template;
}

여기서 중요한 점! 위에서 정의한 각각의 Factory를 넣어주어야 한다!

3. Redis Template Bean 주입

@Service
public class MyService {
    private final RedisTemplate<String, String> redisTemplateOne;
    private final RedisTemplate<String, String> redisTemplateTwo;

    public MyService(
            @Qualifier("redisTemplateOne") RedisTemplate<String, String> redisTemplateOne,
            @Qualifier("redisTemplateTwo") RedisTemplate<String, String> redisTemplateTwo) {
        this.redisTemplateOne = redisTemplateOne;
        this.redisTemplateTwo = redisTemplateTwo;
    }

    // Use redisTemplateOne and redisTemplateTwo to interact with the corresponding Redis instances
}

@Qualifier 를 통해 템플릿을 구분해 사용하면 된다.

 

이렇게 여러개의 redis server를 하나의 ec2 인스턴스에서 사용할 수 있다!

728x90
반응형