레디스 특징
- 레디스는 Key-value 형태의 Nosql DB이다.
- In-Memory DB 이다.
- 관계형 데이터 베이스(mysql)보다 훨씬 빠른데, 그 이유는 메모리 접근이 디스크 접근보다 빠르기 때문이다.
- 인메모리 데이터 베이스 : RAM에 데이터를 저장하기 때문에 빠르지만, 휘발성 메모리이기 때문에 시스템 장애시 데이터가 손실될 수 있다. 따라서 cache로 주로 사용한다.
- 관계형 데이터 베이스(mysql)보다 훨씬 빠른데, 그 이유는 메모리 접근이 디스크 접근보다 빠르기 때문이다.
레디스 자료구조
레디스의 장점은 다양한 자료구조를 지원하는 것이다. 레디스는 다양한 자료구조를 key-value 형태로 저장한다. String, BitMap, Hash, List, Set,Sorted Set 등
- String : 키와 연결할 수 있는 가장 간단한 유형의 값이다. 레디스의 키가 문자열이므로 문자열을 다른 문자열에 매핑하는 것이다. 이 string타입에는 모든 종류의 문자열(이진데이터 포함)을 저장할 수 있다. 따라가 JPEG이미지 , HTML fragment을 캐시하는 용도로 자주 사용한다.
- List : 레디스의 리스트는 일반적인 Linked list의 특징을 갖고 있다. 따라서 리스트 내의 수백만 개의 아이템이 있더라도 head, tail값을 추가할때 동일한 시간이 소요되나 값을 찾을 때 O(N)의 속도를 가지는 단점을 가진다.
- Set : set은 순서가 유지되지 않는 값의모음이다. 값은 중복될수 없고, 교집합, 합집합, 차집합 연산을 레디스에서 수행할수 있기 때문에 객체간의 관계를 표현할 때 좋다.
- Hash : 해쉬는 field-value 쌍을 사용한 일반적인 해시이다. key에 대한 field의 갯수에는 제한이 없으므로 여러 방법으로 사용 가능한다 .이러한 면에서 해쉬는 관계형 데이터 베이스와 비슷하다. key는 table의 pk, field는 column, value는 value로 볼 수 있다.
- Sorted Set : Set자료구조에 Score를 추가로 기록해 Score가 낮은순서부터 높은 순서대로 정렬되는 자료구조이다. 이 구조는 주로 순서가 필요한 곳에 사용된다. 정렬된 형태로 저장되기 때문에 인덱스를 이용해 빠르게 조회가능하다.
- 예를들어 실시간 랭킹 서버를 구현할때 RDBMS를 사용하면, 값을 저장하고, 그 저장한 값을 다시 정렬해 읽어오는 과정이 필요한데 레디스의 sorted-set을 이용하면 더 간단하게 구현할 수 있다.
Pub/sub
pub/sub이란 topic(주제,채널)을 구독한 모두에게 메시지를 발행하는 통신 방법이다. 예를 들어 유투브 채널 구독을 했을 때, 구독한 채널한 사람들이 모두 알림을 받을 수 있는 것 과 같다.
순서
그림을 보면 channel(채널)과 publisher(메세지를 발행하는 사람), subsriber(메세지를 받을 사람)이 존재한다.
- publisher는 레디스 서버 내 채널을 생성한다.
- subscriber는 사전에 해당 채널을 subscribe(구독)한다.
- publisher 는 해당 채널에 메세지를 publish(발행) 한다.
- publisher 가 메세지를 publish(발행) 하면, 채널을 subscibe(구독)중인 subscriber는 모두 메세지를 받을 수 있다.
특징
- 레디스는 메세지를 보관(queuing)하지 않는다. publish (발행)하는 시점에 이미 실행한 subscibe 명령으로 대기하고 있는 클라이언트에게 전달된다.
- push 메세지는 3개의 요소들로 구성된 ‘배열값’을 전송한다
- push 메세지 타입: 어떤 종류의 메세지인지 알려준다.
- subscribe : 채널을 성공적으로 subscribe 했다.
- message : 채널로부터 전송된 메세지
- unsubsribe : 채널을 성공적으로 unsubscribe 했다.
- channel name : subscribe 한 채널 이름
- Message : 전송된 메시지
- push 메세지 타입: 어떤 종류의 메세지인지 알려준다.
사용 예시
- 날씨 정보를 구독한 사람에게 주기적으로 날씨정보를 보낼 때
- 특정 작업을 반복 수행하는 작업자에세 비동기적으로 작업을 보내 처리할때
- 현재 앱에 로그인한 유저에게 푸시를 발송하는 활동
참고 및 출처
- https://medium.com/@saurabh.singh0829/redis-pub-sub-implementation-f3208e4625c7
'CS > 데이터베이스' 카테고리의 다른 글
mysql Index 종류 및 B-Tree 구조 (0) | 2023.06.14 |
---|---|
mysql 쿼리 최적화 (0) | 2023.06.14 |
Mysql JOIN (0) | 2023.02.20 |
데이터베이스 정규화(Normalization) (0) | 2023.02.20 |
RDBMS vs NOSQL (1) | 2023.02.16 |