ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Redis 개념 정리
    Engineering/Database 2019. 12. 19. 00:50
    반응형

     Redis는 "REmote DIctionary System" 의 약자로, 디스크가 아닌 메모리 기반의 Key / Value Store 입니다. Key / Value Store 라는 구조로 다양한 자료구조를 지원합니다. In memory 라는 특성답게 고성능이며, 캐싱, 세션 관리, 메시지 큐 등으로 다양하게 활용되고 있습니다.

     

     레디스는 모든 데이터가 메모리에 저장되지만, 서버가 내려갔다가 올라가는 상황에서 메모리에 상주한 데이터들이 휘발되지 않도록 디스크에 스냅샷을 저장할 수 있습니다.

     


    다양한 데이터 타입

     레디스에서는 크게 5가지의 타입을 사용할 수 있다.

     

    1. String

     일반적인 문자열을 저장하며, 키에 넣을 수 있는 데이터의 최대 크기는 512 MB 입니다. Text 뿐만 아니라 정수형이나 JPG 같은 바이너리 데이터까지 저장할 수 있습니다.

     

    2. List

     하나의 key 에 N 개의 데이터를 가지며, 데이터를 중복하여 저장할 수 있습니다. 양방향 링크드 리스트처럼 List 의 앞, 뒤에 데이터를 PUSH / POP 할 수 있고, INDEX 값을 이용하여 지정된 위치에 데이터를 넣거나 뺄 수도 있습니다.

     

    3. Set

     하나의 key 에 N 개의 중복되지 않은 데이터 값을 가집니다. key 에 속한 데이터들은 정렬되지 않은 그룹입니다.

     

    4. Sorted Set

     Set 의 자료구조 형태에 score 라는 필드가 추가된 데이터 타입입니다. score 는 일종의 가중치로 생각하면 됩니다. Sorted Set 내에서 score 를 기준으로 내부 정렬이 됩니다.

     

    5. Hashes

     field (hashes-key) 와 value 쌍으로 이루어진 테이블을 저장하는 자료 구조입니다.

     

     List, Set, Hash 와 같은 집합형 데이터 구조는 하나의 키당 2^32 개의 데이터를 이론적으로 저장할 수 있으나, 최적의 성능은 일반적으로 1,000 ~ 5,000개 사이라고 합니다.

     


    Redis 의 데이터 보존 방법

     Redis 는 Memcached 와 다르게 데이터를 디스크에서 읽어서 메모리에 올릴 수 있기 때문에 서버가 내려갔다가 올라간 후에도 데이터가 유실되지 않습니다. 데이터를 저장하는 방법은 Snapshot 과 AOF(Append Only File) 가 있습니다.

     

    1. Snapshot

     메모리에 있는 데이터들을 디스크에 옮겨 담는 방식입니다. SAVE 와 BGSAVE 방식 두 가지가 있습니다.

    • SAVE - blocking 방식으로 순차적으로 모든 Redis 의 동작을 정지시키고, 그때의 Snapshot 을 Disk에 저장합니다.
    • BGSAVE - non-blocking 방식으로 별도의 process 를 통해서 수행 당시의 메모리 snapshot 을 디스크에 저장합니다. non-blocking 방식이므로 Redis 의 동작이 멈추지 않습니다.

    스냅샷 방식은 메모리의 상태를 그대로 뜬 것이기 때문에 특정 시점의 백업 및 복구에 유리하고, AOF 방식에 비해 더 빠르게 데이터를 메모리에 올릴 수 있습니다. 하지만 서버가 다운되면 백업된 스냅샷 사이에 변경된 데이터들이 유실되는 단점이 있습니다. 저장 파일의 확장자는 보통 .rdb 로 사용합니다.

     

     

    2. AOF (Append Only File)

     AOF 방식은 Redis 의 모든 write/update 연산 자체를 모두 log 파일의 형태로 기록하는 방법입니다. 서버가 실행되면 순차적으로 연산을 재실행하여 데이터를 복구합니다. 연산 작업이 실행될 때마다 기록하기 때문에 현재 시점까지의 로그를 남길 수 있습니다. 로그 파일에 대해서 append 만 수행하기 때문에 write 속도가 빠르고, 서버가 내려가도 데이터 유실이 발생하지 않습니다. 하지만 모든 연산에 대해서 로그를 남기기 때문에 데이터의 양이 매우 크며, 서버를 재시작 시, 모든 연산을 다시 수행하기 때문에 restart 속도가 느립니다. 확장자는 보통 .aof 를 사용합니다.

     

     

    Snapshot 과 AOF 의 장점들을 모아서 혼용하는 방식으로 사용하는 것이 바람직합니다.

    주기적으로 Snapshot 으로 백업을 하고, 백업 주기 사이의 간격에는 AOF 방식으로 수행을 합니다. 이러한 방법은 서버가 restart 될 때는 Snapshot 을 로드하고, 적은 양의 AOF 로그만 수행하기 때문에 restart 수행 시간이 빠르고, 데이터 유실을 방지할 수 있습니다.


    참고자료

    https://bcho.tistory.com/654

    https://engkimbs.tistory.com/869

    https://mydb.tistory.com/210

    반응형

    'Engineering > Database' 카테고리의 다른 글

    [Redis] Redis 기초 정리하기  (0) 2021.08.08
    [MySQL] Explain 실행 계획  (0) 2020.06.23
    [MySQL] 커버링 인덱스  (0) 2020.06.21
    [MySQL] 인덱스 스캔  (0) 2020.06.19
    [MySQL] 인덱스 정리  (0) 2020.06.17

    댓글

Designed by Tistory.