Finn.ian
article thumbnail

Redis (Remote Dictionary Server)

1-1. Redis 개념

Redis는 Key-Value 기반의 In-memory 데이터 저장소이다.
  • Redis의 장점
    • Key-Value 기반이기 때문에, 쿼리를 작성하지 않아도 결과를 즉시 확인 가능
    • 디스크에 데이터를 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도 측면에서 빠름

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

 

Redis 데이터 구조

 

상단 그림은 데이터별 저장 구조에 대해 표현된 것이고, 하단은 Redis의 다양한 데이터 구조에 대해 표로 정리해둔 내용이다.

No Structure Definition Simple Description
1 String 단순 Key-Value 매핑 구조  
2 Lists Array형식의 데이터 구조 처음과 끝의 데이터를 넣고 빼는 것은 속도가 빠르지만, 중간 데이터 삽입 시 어려움 존재
3 Set 순서가 없는 String 데이터 집합 중복된 데이터는 하나로 처리되기에 중복 데이터는 없음
4 Sorted Set Set과 동일한 구조 Leaderboard와 같은 기능 구현 가능
5 Hash Key-Value 구조를 여러개 가진 object 타입을 저장하기 좋은 구조 -

 

Redis 설명

 

위의 사진과 같이 다양한 자료구조를 지원하게 되면 개발의 편의성이 좋아지며, 난이도가 낮아진다는 커다란 장점이 생긴다.

 

예시
어떤 데이터를 정렬하는 상황 시, DMBS를 활용하면 DB에 데이터 저장, 저장된 데이터 정렬 후 다시 읽어오는 과정은 디스크에 직접 접근해야하기 때문에 시간 소요가 오래 걸린다는 단점을 가지고 있습니다. 이러한 경우, In-Memory 데이터베이스인 Redis를 이용하고 레디스에서 제공하는 Sorted-Set이란 자료 구조를 활용하면 더 빠르게 데이터 정렬이 가능합니다.

 

최종적으로 Redis를 한 문장으로 정의하면 아래와 같다.

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

 

2. Redis 관리

 

그렇다면 Redis는 어떻게 관리하는 것일까, Redis의 특징과 Redis의 maxmemory-policy 설정에 대해 알아보자 .

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 설정

Redis maxmemory-policy 설정값에 대한 내용은 아래와 같다.

 

maxmemory-policy 설정값

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

3. Redis 영속성

Redis는 지속성을 보장하기 위하여 데이터를 Disk에 저장하기 때문에 서버가 다운되더라도 Disk에 저장된 데이터를 읽어서 메모리에 로딩한다..

3-1. Redis Disk 저장 방식

Redis에서 데이터를 Disk에 젖아하는 방식은 크게 두 가지로 분류됩니다.

AoF 이미지

  1. RDB(Snapshotting) 방식
    • 순간적으로 메모리에 있는 내용을 Disk에 전체를 옮겨 담는 방식
  2. AOP(Append On File) 방식
    • Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태

참조

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

Finn.ian

@Finn_

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그