이번엔 Redis Cluster 를 사용하여 데이터를 관리해 봅시다.
혹시나 Redis Cluster와 Redis Sentinel 두가지 방식에 대해 궁금하신 분들을 위해 비교글도 작성하였습니다.
https://rhgustmfrh.tistory.com/123
어쨌든 계속해서 Cluster 를 사용하는 이점은 다음과 같습니다.
하나의 서버에서 문제가 발생하더라도 다른 서버에서 실행중인 슬레이브 노드가 해당 데이터를 제공할 수 있어 가용성이 높아짐, 성능 및 확장성 향상을 위해 여러 노드에 데이터를 분산 저장함
바로 구성해 보죠
yml 설정입니다.
노드 구성:
- 마스터 노드1: 119.119.119.1:7000
- 슬레이브 노드1: 119.119.119.4:7000 (마스터 노드1의 슬레이브)
- 마스터 노드2: 119.119.119.2:7000
- 슬레이브 노드2: 119.119.119.5:7000 (마스터 노드2의 슬레이브)
- 마스터 노드3: 119.119.119.3:7000
- 슬레이브 노드3: 119.119.119.6:7000 (마스터 노드3의 슬레이브)
이렇게 노드가 구성됩니다.
config 입니다.
@Getter
@Setter
@Slf4j
@Configuration
@ConfigurationProperties("spring.redis.cluster")
public class RedisClusterConfig {
private List<String> nodes;
private String password;
// private int maxRedirects;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisClusterConfiguration configuration = new RedisClusterConfiguration(nodes);
if (password != null) {
configuration.setPassword(RedisPassword.of(password));
}
// configuration.setMaxRedirects(maxRedirects);
LettuceConnectionFactory factory = new LettuceConnectionFactory(configuration);
return factory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
레파지토리입니다.
@Slf4j
@Repository
public class RedisRepository {
private final RedisTemplate<String, Object> redisTemplate;
private final HashOperations<String, String, String> hashOperations;
public RedisRepository(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
this.hashOperations = redisTemplate.opsForHash();
}
public String searchRedis(String name) {
String searchName1 = "a" + name.trim();
String searchName2 = "b" + name.trim();
String resultCode1 = "1에서 찾았다";
String resultCode2 = "2에서 찾았다";
String resultCode3 = "그런거 없다";
Boolean step1 = redisTemplate.hasKey(searchName1);
Boolean step2 = redisTemplate.hasKey(searchName2);
if(step1){
return resultCode1;
}else{
if(step2){
return resultCode2;
}
else{
return resultCode3;
}
}
}
}
일부러 전과 동일한 방식의 로직을 구현하였습니다.
레디스를 싱글로 구성하는것과 다르게
클러스터 구성하면 DB0 밖에 사용하지 못합니다. 따라서
위에서 조회한것처럼 데이터 앞에 특정한 값을 넣어 보관 하고 있으면 해당 데이터를
구분하여 조회 할 수 있습니다.
물론 다른 방법이 있겠습니다만 저는 이런 방법을 써봤습니다.
레디스 써보니 빠르고 좋은것 같습니다 강추 드립니다.
감사합니다~~!
이미지 출처 : https://architecturenotes.co/redis/
'레디스' 카테고리의 다른 글
레디스를 캐시로 사용하여 조회하는것과 DB에서 데이터를 조회하는 것의 차이를 실험으로 알아보자 (0) | 2024.06.15 |
---|---|
Redis Sentinel vs Redis Cluster: 고가용성과 확장성의 대결 (0) | 2023.09.19 |
스프링 부트와 레디스를 활용한 데이터 저장 및 관리: 싱글 레디스 설정, Another Redis Desktop Manager 사용, 간단한 조회 예제 (0) | 2023.06.16 |
레디스(Redis)를 활용한 네띠 채팅 프로그램 구축: 간단한 적용 방법과 실시간 메시지 저장 (0) | 2023.03.05 |
Redis를 쓰는 이유 및 장점 (0) | 2023.03.05 |
댓글