IT Log
Redis 본문
728x90
반응형
Redis란?
- Remote Dictionary Server의 약자로, "키-값" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템(DBMS)이다.
장점
- 여러 프로세스에서 동시에 같은 key에 대한 갱신을 요청할 경우, atomic 처리로 데이터 부정합 방지 atomic처리 함수를 제공
- 메모리를 활용하면서 영속적인 데이터 보존
- Redis Server는 1개의 싱글 스레드로 수행된다.
- 쓰기 성능 증대를 위한 샤딩을 지원
- ANSI C로 작성 : ANSI C 컴파일러가 동작하는 곳이면 어디든 설치 및 실행가능
- Redis 클라이언트는 대부분의 언어로 포팅되어 있다.
- 서버 간 이벤트 공유를 위한 Publish/Subscribe 기능 지원
- 100000QPS(Query Per Second)의 고성능
데이터 타입
type | 설명 |
Strings | 기본적인 데이터 타입 |
Lists | 삽입 순서에 따라 정렬된 문자열 모음 |
Sets | 고유하고 정렬되지 않은 문자열 |
Sorted Sets | 정렬된 집합 |
Hashes | 값과 관련된 필드로 구성된 맵 (필드와 값은 모두 문자열) |
Bit arrays | 특수 명령을 사용하여 비트 배열과 같은 문자열 값 |
HyperLogLogs | Set의 카디널리티를 추정하기 위해 사용되는 확률적 데이터구조 |
Streams | 로그 데이터 유형을 제공하는 유사한 항목의 추가전용 모음 |
String
command | sample |
SET key value [ NX | XX ] | set mykey 10 |
GET key | get mykey |
Lists
command | sample |
RPUSH key value [value...] | rpush list a b c |
LRANGE key start stop | lrange list 0 3 |
Sets
command | sample |
SADD key member [member ...] | sadd set a b c |
SMEMBERS key | smembers set |
Hashes
command | sample |
HMSET key field value [field value...] | hmset mykey field1 hello field2 world |
HMGET key field [field...] HGET key field |
hmget mykey field1 field2 hget mykey field1 |
Sorted Sets
command | sample |
ZADD key [NX|XX] [CH] [INCR] score member [score member...] | zadd myset 1 one zadd myset 2 two |
ZRANGE key start stop [WITHSCORES] | zrange myset 0 1 |
https://redis.io/commands 에 접속하면 command에 관해서 자세히 알 수 있다.
Redis 성능 개선 설계
- Replication : 읽기 성능 확장
- Sharding : 쓰기 성능 향상
용어 | 설명 | 구성 유형 |
Replication | 동일 데이터를 다수의 레디스 서버에 중복 분산 저장함으로써, 클라이언트에게 레디스 서버 보유 데이터에 대한 구성 내역 및 위치 투명성을 제공 | 싱글, 다중, 계층적 |
Sharding | 단일 데이터 세트를 특정 조건에 따라 하나 이상의 레디스 서버에 분할 분산 저장해 쓰기성능 확장 | vertical, range, hash based |
Replication
- Master / Slave 구조를 사용
- Master 노드는 쓰기 전용으로 활용하며, Slave노드는 읽기 전용으로 활용하는 읽기와 쓰기의 명시적인 분리구조
- 클라이언트 어플리케이션의 복잡도가 증가하는 제한점
- Master노드는 하나 이상의 Slave노드들에게 데이터 원본ㅇ르 제공해 주는 역할을 하며, 슬레이브 노드는 마스터 노드에 최초 접속시 전체 데이터를 수신해 동기화한 뒤 이후에는 변경 데이터만을 수신해 지속적으로 데이터 동기화를 유지
- Master노드의 위치 정보를 Slave노드가 보유하는 특성을 가지며, Slave노드 추가 시 마스터 노드의 설정 변경이나 재시작이 필요하지 않은 실시간 동적 확장성을 제공
- 동적확장성은 용량,성능 확장시 서비스 구성요소의 재기동 등으로 인해 서비스가 중단되는 일이 없는 확장성을 지원
Sharding
- 데이터 세트 분할 분산 저장
- Redis에 저장, 활용하는 데이터 세트의 크기 확대
- 쓰기 요청에 대한 성능 개선
- 동일 데이터 세트 중복 분산 저장 시에는 저장할 수 있는 데이터 세트의 크기가 마스터 노드의 물리 메모리 용량을 초과할 수 없다
- Master노드는 Slave노드에 데이터를 복제하기 위해 fork함수를 통해 child프로세스를 생성하는데, 이 때 child프로세스는 parent프로세스와 메모리 영역을 공유하지만, fork 이후 데이터 변경이 발생하는 메모리 페이지는 지연기록 매커니즘에 의해 child프로세스의 고유 메모리 영역으로 복사
유형 | 설명 |
Vertical Sharding | 데이터 성격을 기준으로 논리적으로 분할 |
Range Sharding | Key Value에 따라 데이터가 저장될 노드를 결정 |
Hash based Sharding | key의 hash 값에 따라 데이터가저장될 노드를 결정 |
데이터 영속성
- 기본적으로 메모리에 데이터를 저장하고 활용하는 구조
- 실제 상용 서비스가 데이터 손실을 감내할 수 없는 여건이라면 휘발성 저장매체인 메모리가 제공해 주지 못하는 데이터 가용성은 스냅샷 또는 AOF을 활용함으로써 확보
- 스냅샷과 AOF를 활용함으로써 데이터 손실을 최소화하고 필요한 경우 유실된 데이터를 복구
유형 | 설명 |
스냅샷 |
|
AOF | Redis 인스턴스가 수신하는 모든 쓰기 명령을 AOF 파일에 기록 |
728x90
반응형
'기타' 카테고리의 다른 글
Tensorflow (2) (0) | 2019.05.08 |
---|---|
TensorFlow (0) | 2019.05.07 |
Cassandra (0) | 2019.05.07 |
MongoDB (0) | 2019.05.07 |
NoSQL (0) | 2019.05.07 |
Comments