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
반응형