Redis (Remote Dictionary Server)
1-1. Redis 개념
Redis는 Key-Value 기반의 In-memory 데이터 저장소이다.
- Redis의 장점
- Key-Value 기반이기 때문에, 쿼리를 작성하지 않아도 결과를 즉시 확인 가능
- 디스크에 데이터를 쓰는 구조가 아니라 메모리에서 데이터를 처리하기 때문에 속도 측면에서 빠름
1-2.다양한 데이터 구조(Collection) 제공
상단 그림은 데이터별 저장 구조에 대해 표현된 것이고, 하단은 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 타입을 저장하기 좋은 구조 | - |
위의 사진과 같이 다양한 자료구조를 지원하게 되면 개발의 편의성이 좋아지며, 난이도가 낮아진다는 커다란 장점이 생긴다.
예시
어떤 데이터를 정렬하는 상황 시, 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 여부에 대한 알람 받기 가능
- expire set을 가진 것 중 가장 적게 액세스한 키부터 제거하여 공간 확보
3. Redis 영속성
Redis는 지속성을 보장하기 위하여 데이터를 Disk에 저장하기 때문에 서버가 다운되더라도 Disk에 저장된 데이터를 읽어서 메모리에 로딩한다..
3-1. Redis Disk 저장 방식
Redis에서 데이터를 Disk에 젖아하는 방식은 크게 두 가지로 분류됩니다.
- RDB(Snapshotting) 방식
- 순간적으로 메모리에 있는 내용을 Disk에 전체를 옮겨 담는 방식
- AOP(Append On File) 방식
- Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태
참조
'Data Engineering > DBMS' 카테고리의 다른 글
[PostgreSQL] Database Partitioning (0) | 2023.08.23 |
---|---|
[DB 기초] 트랜잭션(Transaction)과 그 특성은 무엇인가 (0) | 2023.08.19 |
[PostgreSQL] 사용자에게 권한 부여하기 (0) | 2023.07.13 |
[PostgreSQL] Primary Key 재설정 (0) | 2023.07.04 |
[PostgreSQL] ERROR : Column reference [컬럼명] is ambiguous 오류 및 해결법 (0) | 2023.04.11 |