회사에서 발표 준비 했던거... 레디스 관련 정리!!
Redis
"Remote Dictionary System"의 약자로 메모리 기반의 Key-Value Stroe 입니다.
- List, Hash, Set, Sorted Set, List 같은 여러 형식의 자료구조를 지원합니다.
- NoSql DBMS로 분류 되기도 하고, memcahed와 같은 In memory 솔루션으로 분리 되기도 합니다.
- 쓰기 성능 증대를 위한 클라이언트 측 샤딩(Sharding)을 지원합니다.
- 메모리에 상주하면서 RDBMS의 캐시 솔루션으로 주로 사용되며 Instagram, Line, StackOverflow, Blizzard 등 여러 소셜 서비스에서 사용하는 검증 된 오픈소스 솔루션 입니다.
<In memory>
데이터 읽기 성능 개선을 위해 데이타베이스와 같은 영구 저장소로부터 데이터를 로드하여 메모리(RAM)에 저장할 수 있는 아키텍쳐를 말합니다.
<Sharding>
같은 테이블 스키마를 가진 데이터(row)를 다수의 데이터베이스에 분산하여 저장하는 방법을 말합니다.
특징
[Key-Value Stroe]
특정 Key값에 저장하는 구조로 되어 있고 기본적인 PUT/GET Operation을 지원합니다.
이 모든 데이터는 메모리에 저장되고, 이로 인하여 매우 빠른 읽기 쓰기 속도가 보장됩니다. 그래서 전체 저장 가능한 데이터 용량은 물리적인 메모리 크기를 넘어설 수 있습니다.
[다양한 데이터 타입]
단순한 메모리 기반의 Key-Value 라면 이미 memcached가 있습니다.
데이터가 메모리만 저장되는 Memcached에 반면 Redis는 메모리 + Disck에도 저장이 된다는 차이점도 있지만
또 어떤 차이 때문에 Redis의 사용이 더 많을까요?
Redis의 Key-Value Stroe에서 Value는 단순한 Object가 아니라 자료구조를 갖기 때문입니다.
Redis가 지원하는 데이터 형은 크게 아래와 같이 5가지로 나눌 수 있습니다.
- String
- 일반적인 문자열로 최대 512mb 길이 까지 지원합니다. Text 문자열뿐만 아니라 Integer와 같은 숫자나 JPEG같은 Binary File까지 저장할 수 있습니다.
- Set
- Set은 String의 집합입니다. 여러개의 값을 하나의 Value 내에 넣을 수 있다고 생각하면 됩니다. 블로그의 태크(Tag)등에 사용될 수 있습니다.
- Set간의 연산을 지원합니다. 교집합, 합집합, 차이를 매우 빠른 시간내에 추출할 수 있습니다.
- Sorted Set
- Set에 "score"라는 필드가 추가된 데이터 형으로 score는 일종의 가중치 정도로 생각하면됩니다 sorted set에서 데이터는 오름차순으로 내부 정렬되며, 정렬이 되어있는 만큼 score 값 범위에 따른 쿼리, top rank에 따른 쿼리 등이 가능합니다.
- Hashes
- Hash는 value 내에 field/string value 쌍으로 이루어진 테이블을 저장하는 데이터 구조입니다. RDBMS에서 PK 1개와 string 필드 하나로 이루어진 테이블이라고 이해하면 됩니다.
- List
- String들의 집합으로 저장되는 데이터 형태는 Set과 유사하지만, 일종의 양방향 Linked List라고 생각하시면 됩니다. List 앞과 뒤에서 Push/Pop 연산을 이용해서 데이터를 넣거나 뺄 수 있고, 지정된 Index값을 이용하여 지정된 위치에 데이터를 넣거나 뺄 수 있습니다.
[영속성 (Persistence)]
서버가 종료된 후에 다시 시작 하더라도 Disk에 저장해 놓은 데이터를 다시 읽어서 데이터가 유실되지 않습니다.
데이터 저장 방식은 2가지 정도가 있습니다.
- Snapshot
- 특정 시점 또는 반복적으로 메모리에 있는 전체 데이터를 디스크에 저장합니다.
- 장점
- 파일 크기가 작아 AOF 보다 로딩시간이 빠릅니다.
- 단점
- 특정 시점에 데이터를 저장함에 따라 이슈 발생 시 데이터가 유실 될 수 있습니다.
- AOF (Append Only File)
- 명령어가 실행 될 때 마다 기록이 저장됩니다.
- 장점
- 서버 장애가 발생해도 데이터 유실이 거의 없습니다.
- 텍스트 파일로 백업을 제공합니다. 손상이 발생하더라도 쉽게 Edit하여 복구 가능합니다.
- 단점
- 모든 명령이 기록되기 때문에 파일 크기가 커지며, 데이터 로딩이 느려질 수 있습니다, OS의 파일 크기 제한으로 장애가 발생할 수 있습니다.
- Re-write를 통해 파일 크기를 줄일 수 있으며, Re-write를 할 경우 파일의 최종 데이터만 남게 됩니다.
- 모든 명령이 기록되기 때문에 파일 크기가 커지며, 데이터 로딩이 느려질 수 있습니다, OS의 파일 크기 제한으로 장애가 발생할 수 있습니다.
비교
[Redis와 다른 데이터베이스 및 소프트웨어 비교]
[Redis vs Memcached]
분류RedisMemcached
처리속도 | 데이터가 디스크와 메모리에 저장되는데 Memcached와 성능 차이가 없고, 빠릅니다. |
데이터가 메모리에만 저장되며, 빠릅니다. |
데이터 저장방식 |
데이터가 디스크에도 저장이 되기 때문에 데이터 복구가 가능합니다 |
데이터가 메모리에만 저장되기 때문에 프로세스가 죽거나, 장애 발생 시 데이터가 사라집니다. |
만료일 지정 방식 |
만료일을 지정하면 만료된 데이터는 캐시처럼 사라짐니다. | 동일 |
메모리 재사용 |
메모리를 재사용하지 않고, 명시적으로 데이터 제거가 가능합니다. |
저장소 메모리를 재사용, 만료전에 더 이상 데이터를 넣을 메모리가 없으면 LRU 알고리즘에 따라 데이터를 삭제합니다. |
데이터 타입 | 다양한 데이터 타입 지원 | 문자열만 지원 |
Redis 사용 사례
- 캐싱
- 데이터베이스 앞에 배치된 Redis는 성능이 뛰어난 In memory 캐시를 생성하여 액세스 지연 시간을 줄이고, 처리량을 늘리며, 관계형 또는 NoSQL 데이터베이스의 부담을 줄여줍니다.
- 세션 관리
- 빠른 키 값 스토어를 사용하면 간단하게 세션 정보를 관리할 수 있습니다.
- 실시간 순위표
- Sorted Set 데이터 구조를 사용하면 요소가 목록에 유지되고 점수에 따라 정렬됩니다. 손쉽게 동적 순위표를 생성할 수 있습니다.
- 속도제한
- 대기열
- Redis List 데이터 구조를 사용하며 간단한 영구 대기열을 손쉽게 구현할 수 있습니다. 자동 작업 및 차단 기능을 제공하므로 신뢰할 수 있는 메시지 브로커 또는 순환 목록이 필요한 다양한 애플리케이션에 적합합니다.
- 채팅 및 메시징
정리
- 리스트형 데이터 입력과 삭제가 MySQL에 비해서 10배정도 빠름.
- 메모리를 활용하면서 영속적인 데이터 보존.
- 명령어로 명시적 삭제, expires를 설정하지 않으면 데이터가 삭제되지 않는다.
- shapshot(기억장치) 기능을 제공하여 메모리의 내용을 *.rdb 파일로 저장하여 해당 시점으로 복구할 수 있다.
- 1개의 Single Thread로 수행, 서버 하나에 여러개의 서버를 띄우는 것이 가능.
감사합니다😀
** 그냥 하루하루 개인 공부한 것을 끄적 거리는 공간입니다.
이곳 저곳에서 구글링한 것과 강의 들은
내용이 정리가 되었습니다.
회사에서 정리한 내용이라 출처를 표시하지 못하였습니다.
문제가 될시 말씀해주시면 해당 부분은 삭제 하도록하겠습니다. **
'public void static main > Etc' 카테고리의 다른 글
[OS] 메모리 영역 (0) | 2022.02.01 |
---|---|
[Swagger] 스웩! 췤! (0) | 2022.01.29 |
[Design Pattern] Bridge Pattern (0) | 2021.11.16 |
[Design Pattern] Decorator Pattern (0) | 2021.11.16 |
[Design Pattern] Facade Pattern (0) | 2021.11.11 |
댓글