대용량 데이터 & 트래픽
-
Redis의 Pub/Sub을 이용한 채팅방 기능 구현대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 11. 14:34
Pub/Sub 패턴 메시징 모델 중의 하나로 발행과 구독 역할로 개념화한 형태 발행자와 구독자는 서로에 대한 정보 없이 특정 주제를 매개로 송수신 메시징 미들웨어의 장점 비동기 통신 가능 결합도가 낮음 - 개인끼리 직접 의존하지 않고 공통 미들웨어에 의존 메시징 미들웨어의 제품들로는 대표적으로 Kafka, RabbitMQ, ActiveMQ 등이 있다. 각각의 장점이 있기 때문에 상황에 맞게 사용해야 한다. Redis의 Pub/Sub의 특징은 Queue에 메시지가 저장되지 않는다는 점이 있다. 즉, 온라인으로 연결된 subsriber들에게만 메시지가 전달된다. 또한 Kafka의 컨슈머 그룹같은 분산처리 개념이 없기 때문에 subscriber가 늘어날수록 성능이 저하된다. Redis의 Pub/Sub이 필요한..
-
redis의 Sorted Sets을 활용한 리더보드 구현대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 11. 13:31
게임에서의 랭킹과 같은 리더보드는 RDBMS로 구현하면 한 개 데이터의 조회는 빠르지만 정렬된 데이터와 범위 탐색은 느리다. redis의 Sorted Sets은 정렬되어 있는 set이기 때문에 업데이트와 범위 탐색이 효율적이다. RankingService @Service public class RankingService { private static final String LEADERBOARD_KEY = "leaderBoard"; @Autowired StringRedisTemplate redisTemplate; public boolean setUserScore(String userId, int score) { ZSetOperations zSetOps = redisTemplate.opsForZSet(); ..
-
서비스 속도를 높이는 redis의 캐시레이어대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 10. 21:42
데이터를 계속 db에 접근해서 가져오게 된다면 많은 부하가 걸리기 때문에 서비스의 성능이 안 좋을 것이다. Redis의 Caching은 CPU의 메모리에 저장을 해뒀다가 사용하는 기술이며 대표적인 구현 방식은 캐시에 데이터가 없으면 DB에서 데이터를 가져오고, 데이터가 있다면 그냥 사용하는 Cache-Aside(Lazy Loading)이다. UserService @Service public class UserService { @Autowired private ExternalApiService externalApiService; // 이게 외부 서비스라 가정 (여기서는 외부 db) public UserProfile getUserProfile(String userId) { String userName = e..
-
분산 환경에서의 session 스토어대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 10. 20:27
세션을 이용해서 로그인을 진행한다고 할 때, 로드 밸런싱을 사용하려면 세션 동기화를 만들어줘야 한다. 만약에 그렇지 않으면 8080포트에서 로그인 한 사용자가 8081 포트로 요청을 보낼 때 사용자의 정보가 없을 것이다. Redis를 사용하면 세션 클러스터링을 할 수 있다. build.gradle dependencies { implementation 'org.springframework.session:spring-session-data-redis' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-redis' testIm..
-
Redis의 data type대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 10. 13:06
redis를 설치하는 수고를 덜기 위해 docker를 사용했다. docker pull로 redis 이미지를 가져온 다음 docker run을 이용해서 redis를 my-redis라는 이름으로 실행시켜줬다. 이제 Redis에서의 data type에 대해 하나씩 알아보겠다. 1. Strings 가장 기본적인 데이터 타입이며 제일 많이 사용됨 바이트 배열을 저장 바이너리로 변환할 수 있는 모든 데이터를 저장 가능 (JPG와 같은 파일 포함) 최대 크기는 512MB docker exec -it my-redis /bin/sh를 입력해서 shell로 접속을 한 뒤에 redis-cli를 입력하면 redis 명령어를 입력할 수 있다. 위의 사진은 SET과 GET 명령어를 통해 myname = hello 라는 데이터를 ..
-
In-memory DB인 Redis의 특징대용량 데이터 & 트래픽/대용량 처리를 위한 redis 2024. 3. 10. 10:39
Redis의 정의 Remote Dictonary Server Storage : 데이터를 저장하는 외부 저장소 NoSQL - 영속성의 관점에서 전통적인 DBMS 역할을 수행함 Middleware : 어플리케이션이 이용할 수 있는 유용한 기능을 제공하는 소프트웨어 Redis의 장점 아주 빠른 데이터 저장소로 활용 분산된 서버들간의 커뮤니케이션 (외부 저장소이기 때문에 로드밸런싱된 분산 시스템에서 동기화 가능) 내장된 자료구조를 활용 가능 보통의 DB는 사진처럼 Disk에 저장되는데, Redis는 Memory 영역에 저장된다. Disk에 저장하는 것보다 Memory에 저장하는 것이 훨씬 빠르긴 한데 휘발성의 문제가 있다. 그렇기 때문에 중요한 데이터는 DB에 저장을 하고, 세션 데이터, 캐시와 같은 데이터들을..
-
300만개의 데이터 삽입 후 index로 성능 비교대용량 데이터 & 트래픽/대용량 처리를 위한 mysql 2024. 3. 6. 20:18
public class PostFixtureFactory { public static EasyRandom get(Long memberId, LocalDate firstDate, LocalDate lastDate) { var idPredicate = named("id") .and(ofType(Long.class)) .and(inClass(Post.class)); var memberIdPredicate = named("memberId") .and(ofType(Long.class)) .and(inClass(Post.class)); var param = new EasyRandomParameters() .excludeField(idPredicate) .dateRange(firstDate, lastDate) .ra..
-
mysql에서 조회 최적화를 위한 인덱스대용량 데이터 & 트래픽/대용량 처리를 위한 mysql 2024. 3. 5. 22:03
인덱스란 정렬된 데이터를 가지는 새로운 테이블을 의미한다. 일반적인 테이블은 PK 값으로 저장이 되기 때문에 특정 컬럼 (ex. 나이) 등으로 검색하는데 시간이 오래 걸리는데, 인덱스를 생성해놓으면 나이로 정렬된 새로운 테이블을 만들어 놓고 PK 값으로 매핑한다. 인덱스의 자료구조 Tree - 트리 높이에 따라 시간 복잡도가 결정 - 트리의 높이를 최소화하기 위해 B+ Tree를 사용 B+ Tree의 장점 - 삽입 / 삭제 시 항상 균형을 이룸 - 하나의 노드가 여러 개의 자식 노드를 가질 수 있음 - 리프노드에만 데이터가 존재 (연속적인 데이터 접근 시 유리함) 하지만 인덱스를 사용하는 것은 조회의 성능은 높일 수는 있지만 쓰기나 수정, 삭제의 성능은 낮출 수 있으므로 잘 고려해서 사용해야 한다. 클러..