Data structure store Redis 정리

Haribo·2022년 3월 6일
post-thumbnail
Redis logo

Redis (Remote Dictionary Server)

1. Redis의 개념

Redis는 Key-Value 기반의 인-메모리 데이터 저장소
  • Key-Value 기반이기 때문에, 쿼리를 작성하지 않아도 결과를 바로 알 수 있음
  • 디스크에 데이터를 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도 측면에서 빠름

1-1. Redis는 다양한 데이터 구조(Collection) 제공

Redis 데이터 구조

상단은 데이터별 저장 구조에 대해 그림으로 표현된 것이며, 하단은 Redis의 다양한 데이터 구조에 대한 표로 데이터와 정의, 간단한 설명입니다.

NumberStructuredefinitionSimple description
1String단순한 키-값 매핑 구조-
2ListsArray형식의 데이터 구조List 사용 시, 처음과 끝의 데이터를 넣고 빼는 것은 속도가 빠르지만, 중간에 데이터 삽입 시 어려움 존재
3Sets순서가 없는 Strings 데이터 집합Sets에서는 중복된 데이터는 하나로 처리하기 때문에, 중복에 대한 걱정 No
4Sorted SetsSets와 동일 구조(Score를 통해 순서를 정할 수 있음)Sorted Sets를 사용하면 Leaderboard와 같은 기능 구현 가능
5Hashes키-값의 구조를 여러개 가진 object 타입을 저장하기 좋은 구조-

Redis 설명

위의 사진과 같이 다양한 자료구조를 지원하게 되면 개발의 편의성이 좋아지며, 난이도가 낮아진다는 커다란 장점이 생깁니다.
예를 들어
어떤 데이터를 정렬하는 상황 시, DMBS를 활용하면 DB에 데이터 저장, 저장된 데이터 정렬 후 다시 읽어오는 과정은 디스크에 직접 접근해야하기 때문에 시간 소요가 오래 걸린다는 단점을 가지고 있습니다. 이러한 경우, In-Memory 데이터베이스인 Redis를 이용하고 레디스에서 제공하는 Sorted-Set이란 자료 구조를 활용하면 더 빠르게 데이터 정렬이 가능합니다.

최종적으로 Redis를 한 문장으로 정의하면

고성능 키-값 저장소로 리스트, 해시, 문자열, 셋 해시, 정렬된 셋 형식의 데이터를 지원하는 NoSQL이다.

그렇다면 Redis는 어떻게 관리하는 것일까?

2. Redis 관리

2-1. Redis 특징

싱글스레드와 멀티 스레드에 대한 그림

Redis는 Singer threaded가 대표적인 특징으로 상단의 그림에서 왼쪽에 위치해있습니다.

  • 명령어를 포함한 Packet이 MTU(Maximum Trasmission Unit)보다 크면 Packet이 쪼개져서 올 수 있는데, Redis는 쪼개진 명령어를 합쳐서 하나의 명령어가 되는 순간, 해당 명령어 실행
    • Get/Set 명령어일 경우, 초당 10만개 정도까지는 처리 가능
  • 단점 - 처리시간이 긴 명령어를 중간에 넣으면 그 뒤에 있는 명령어들은 전부 기다려야 함
    • 대표적인 특징인 Singer threaded 때문
    • 따라서 처리시간이 긴 명령어를 실행한 경우, Get/Set 명령어들은 타임아웃이 나타나서 요청 실패할 수 있음

Redis 서비스 운영 시, Redis 서버의 메모리가 한계에 도달할 수 있지만, 메모리의 한계는 maxmemory값으로 설정이 가능합니다.
또한, maxmemory 수치까지 메모리가 다 차는 경우, Redis는 maxmemory policy에 따라서 추가 메모리를 확보할 수 있습니다.

2-2. Redis maxmemory-policy 설정

▣ maxmemory-policy 설정값

  1. noeviction : 기존 데이터를 삭제하지 않음.
    • 메모리가 꽉 찬 경우에는 OOM(Out Of Memory) 오류 반환하고 새로운 데이터는 버리게 됩니다.
  2. allkeys-lru : LRU(Least Recently Used)라는 페이지 교체 알고리즘을 통해 데이터를 삭제하여 공간 확보
  3. volatile-lru : expire set을 가진 것 중 LRU로 삭제하여 메모리 공간 확보
  4. allkeys-random : 랜덤으로 데이터를 삭제하여 공간 확보
  5. volatile-random : expire set을 가진 것 중 랜덤으로 데이터를 삭제하여 공간 확보
  6. volatile-ttl : expire set을 가진 것 중 TTL(Time To Live) 값이 짧은 것부터 삭제
  7. allkeys-lfu : 가장 적게 액세스한 키를 제거하여 공간 확보
  8. volatile-lfu : expire set을 가진 것 중 가장 적게 액세스한 키부터 제거하여 공간 확보
  • eviction : Maxmemory 초과로 인해서 데이터가 지워지게 되는 것
  • Redis에 들어가서 INFO 명령어를 친 후 evicted_keys 수치를 보면 eviction이 발생여부 확인 가능
  • Amazon Elasticache를 사용하는 경우, monitoring tab에 들어가면 eviction에 대한 그래프가 있는데, 이를 통해 Eviction 여부에 대한 알람 받기 가능

3. Redis 영속성

레디스는 지속성을 보장하기 위하여 데이터를 Disk에 저장합니다. 따라서, 서버가 다운되더라도 Disk에 저장된 데이터를 읽어서 메모리에 로딩합니다.

3-1. Redis Disk 저장 방식

Redis에서 데이터를 Disk에 젖아하는 방식은 크게 두 가지로 분류됩니다.
AoF 이미지
1. RDB(Snapshotting) 방식
- 순간적으로 메모리에 있는 내용을 Disk에 전체를 옮겨 담는 방식

  1. AOP(Append On File) 방식
    • Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태

참조
1. Dayone님의 Branch / Redis 기본 정리 / 2020.7.19
2. Redis-Wikipedia
3. 우아한테크세미나 by 강대명님
4. rmcodestar git블로그

profile
개발 기록 남기는 중..

0개의 댓글